今回はルーティングルールについて説明します。

ルーティングルールの設定についてもsymfonyと同様に扱うことができます。
具体的には、プラグインの apps/*/config/routing.yml
を適切に設定してやることです。

しかし何も考えずにrouting.ymlを作ってしまうと、第5回で説明したことと同じようなことが発生します。
pc_frontendとmobile_frontendで同じルーティングルールを別々のファイルに記述することは
今後の変更があったときに、間違いを生みやすく思わぬバグを生じさせることがあります。

そこで、複数アプリケーションで同じルーティングルールを持たせるような場合は
ルーティングコレクションを使いまわすことによりこの問題を解決します。

ルーティングコレクションの作成

plugins/opVotePlugin/lib/routing/opVotePluginFrontendCollection.class.php
を作成しましょう。

<?php

class opVotePluginFrontendRouteCollection extends sfRouteCollection
{
  public function __construct(array $options)
  {
    parent::__construct($options);

    $this->routes = array(
      'vote_list' => new sfRequestRoute(
        '/vote',
        array('module' => 'vote', 'action' => 'index'),
        array('sf_method' => array('get'))
      ),  
      'vote_new' => new sfRequestRoute(
        '/vote/new',
        array('module' => 'vote', 'action' => 'new'),
        array('sf_method' => array('get'))
      ),  
      'vote_create' => new sfRequestRoute(
        '/vote/create',
        array('module' => 'vote', 'action' => 'create'),
        array('sf_method' => array('post'))
      ),  
      'vote_edit' => new sfDoctrineRoute(
        '/vote/edit/:id',
        array('module' => 'vote', 'action' => 'edit'),
        array('id' => '\d+', 'sf_method' => array('get')),
        array('model' => 'VoteQuestion', 'type' => 'object')
      ),  
      'vote_update' => new sfDoctrineRoute(
        '/vote/update/:id',
        array('module' => 'vote', 'action' => 'update'),
        array('id' => '\d+', 'sf_method' => array('post')),
        array('model' => 'VoteQuestion', 'type' => 'object')
      ),  
      'vote_show' => new sfDoctrineRoute(
        '/vote/show/:id',
        array('module' => 'vote', 'action' => 'show'),
        array('id' => '\d+', 'sf_method' => array('get')),
        array('model' => 'VoteQuestion', 'type' => 'object')
      ),
      'vote_post' => new sfDoctrineRoute(
        '/vote/post/:id',
        array('module' => 'vote', 'action' => 'post'),
        array('id' => '\d+', 'sf_method' => array('post')),
        array('model' => 'VoteQuestion', 'type' => 'object')
      ),
      'vote_delete_confirm' => new sfDoctrineRoute(
        '/vote/delete/:id',
        array('module' => 'vote', 'action' => 'deleteConfirm'),
        array('id' => '\d+', 'sf_method' => array('get')),
        array('model' => 'VoteQuestion', 'type' => 'object')
      ),
      'vote_delete' => new sfDoctrineRoute(
        '/vote/delete/:id',
        array('module' => 'vote', 'action' => 'delete'),
        array('id' => '\d+', 'sf_method' => array('post')),
        array('model' => 'VoteQuestion', 'type' => 'object')
      ),
      // no default
      'vote_nodefaults' => new sfRoute(
        '/vote/*',
        array('module' => 'default', 'action' => 'error')
      ),
    );
  }
}

※今後変更の可能性ありの暫定的なものです。

各アプリケーションでの設定

作成したコレクションを各アプリケーションで設定します。

plugins/opVotePlugin/apps/pc_frontend/config/routing.yml で以下のような設定を行います。

vote:
  class: opVotePluginFrontendRouteCollection
  options: { name: vote }

チェック

一度キャッシュを削除します。

$ ./symfony cc

その後、以下のコマンドを入力します。

$ ./symfony app:routes pc_frontend

設定されたルーティングルールが表示され、上記で設定した項目が正しく表示されていれば以下が出るはずです。

...省略...
vote_list                                              GET          /vote
vote_new                                               GET          /vote/new
vote_create                                            POST         /vote/create
vote_edit                                              GET          /vote/edit/:id
vote_update                                            POST         /vote/update/:id
vote_show                                              GET          /vote/show/:id
vote_post                                              POST         /vote/post/:id
vote_delete_confirm                                    GET          /vote/delete/:id
vote_delete                                            POST         /vote/delete/:id
vote_nodefaults                                        ANY          /vote/*

備考 〜 デフォルトのルーティングルールの利用について

ルーティングルールを設定しなくても、アクションを書けば
/:module/:action/* というデフォルトのルーティングルールが適用されるため
アクセスが可能です。
しかし、これを利用することは非推奨とされています。

OpenPNE3本体の
lib/routing/opSymfonyDefaultRouteCollection.class.php
を見てみましょう。

このコレクションではルーティングルール設定の際に追加されます。
そこで、 /:module/:action/* は
opDeprecatedRouteというルートクラスで追加されているのが
見えるはずです。

このルートクラスでルーティングが適用されるとエラーメッセージがログに残ります。