私はSymfony 2.に取り組んでおり、新しいrouteと新しいcontrollerを宣言しましたが、ブラウザからこのコントローラーを呼び出すと、これを取得しますエラー:
The controller for URI "/user/1" is not callable. in /dev.mydomain.org/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php at line 82
これは私の単純なroute設定です:
user_homepage:
pattern: /user
defaults: { _controller: UserBundle:Default:index }
user_show:
pattern: /user/{id}
defaults: { _controller: UserBundle:Default:show }
requirements:
id: \d+
そして、これは私の非常に単純なcontroller:
public function showUserAction($id)
{
return $this->render('UserBundle:Default:show.html.twig', array());
}
なにが問題ですか?
与えられた例とは関係ありませんが、このエラーはコントローラーのアクションがパブリックでない場合にも発生する可能性があります
コントローラ関数をshowUserAction
として定義していますが、定義ではshow[Action]
。
ルート構成を変更するか
user_show:
pattern: /user/{id}
defaults: { _controller: UserBundle:Default:showUser }
requirements:
id: \d+
またはコントローラの署名を変更します
public function showAction($id)
{
これが役立つかどうかを確認します
コントローラがサービスとして定義されている場合、受け入れられた答えと同様に、例えば(YAMLで):
services:
user.default:
class: \UserBundle\DefaultController
そして、ルートはこのコントローラーサービスを使用します。
user_show:
pattern: /user/{id}
defaults: { _controller: user.default:showUserAction }
requirements:
id: \d+
次に、アクションメソッドに名前を付ける必要がありますin in fullサフィックスAction
を含めます。そうしないと、「controller ... is callable」エラーが表示されます。
ここではそうではありません。しかし、別の関連する問題があります。
'Action'サフィックスを忘れると、すべて機能します。しかし、サフィックスを忘れてから追加したことに気付いたときは...驚きです! OPと同じエラー。
ここでの問題はキャッシュについてです
SymfonyはURLをキャッシュするために2つのファイルを作成します:
アクション名を変更する(つまり、「Action」サフィックスを追加する)と、そのキャッシュ情報は廃止されます。
ソリューション
php app/console cache:clear
私の場合、symfony 2を使用していました。
Symfonyの以前のバージョンはメソッドの命名規則を維持しています。メソッドの接尾辞にはAction Wordを含める必要があります。
例:
ルートymlファイルでは、メソッド定義は
docudex_report_make_authorization:
pattern: /make-authorization
defaults: { _controller: DocudexReportBundle:Default:makeAuthorization }
コントローラーではメソッドは
public function makeAuthorization(){}
したがって、エラーが発生していました。
メソッド名をpublic function makeAuthorizationAction
に変更すると、完全に機能しました。