今回はルーティングルールについて説明します。
ルーティングルールの設定についても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というルートクラスで追加されているのが
見えるはずです。
このルートクラスでルーティングが適用されるとエラーメッセージがログに残ります。