0

Symfony を使い始めたばかりで、ルーティングの問題が発生しています。コントローラーからのルーティングは次のとおりです。

/**
 * @Route("/social/{name}/", name="_speed1")
 * @Route("/social/drivers/")
 * @Route("/social/drivers/{name}/", name="_driver")
 * @Route("/social/", name="_speed")
 * @Template()
 */
public function unlimitedAction()
{

speed/social/ または speed/social/bob または speed/social/drivers/ または speed/social/drivers/bob に移動すると、これらのページはすべて問題なくレンダリングされます。ただし、名前を渡す必要があるため、変更しました

public function unlimitedAction()
{ 

public function unlimitedAction($name)
{

speed/social/drivers/ または speed/social/drivers/bob に移動すると、正常に返されます。ただし、speed/social/ に移動すると、次のエラーが表示されます。

Controller "MyBundle\Controller\DefaultController::unlimitedAction()" 
requires that you provide a value for the "$name" argument (because there is 
no default value or because there is a non optional argument after this one).

あるルートでは機能するのに、他のルートでは機能しない理由がわかりません。

私の質問は、次の場所に移動できるようにルーティングを達成するにはどうすればよいかということです。

speed/social/
speed/social/drivers/
speed/social/drivers/bob

そして、エラーなしで変数をアクションに渡すことができます。

ありがとう!

4

1 に答える 1

2

あなたの質問に答えるには、URLnameにパラメータがないルートごとに、パラメータのデフォルト値を指定する必要があります。{name}今はテストできず、注釈を使用するときの構文を思い出せませんが、次のようにする必要があります。

/**
 * @Route("/social/{name}/", name="_speed1", defaults={"name"=null})
 * @Route("/social/drivers/{name}/", name="_driver", defaults={"name"=null})
 * @Template()
 */
public function unlimitedAction($name)
{
}

このようにして、 andと同様に/social/andを呼び出すことができるはずです。/social/foo/social/drivers//social/drivers/foo

しかし、実際には、これは正しい方法ではありません。それぞれが単一のルートにバインドされた、より多くのアクションを定義するだけです。

/**
 * @Route("/social", name="social_index")
 * @Template()
 */
public function socialIndexAction() { } // /social

/**
 * @Route("/social/{name}", name="social_show")
 * @Template()
 */
public function socialShowAction($name) { } // /social/foo

原則として、各メソッド (各アクション) は 1 つのことだけを行うことに焦点を当て、できるだけ短くする必要があります。サービスを使用して、コントローラーが本来行うべきことを実行できるようにします。つまり、ユーザー入力を理解し、サービスを呼び出し、ビューを表示します。

于 2013-02-02T23:36:30.117 に答える