web-dev-qa-db-ja.com

「URIのコントローラーが呼び出し可能でない」エラーのトラブルシューティング

私は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());
}

なにが問題ですか?

24

与えられた例とは関係ありませんが、このエラーはコントローラーのアクションがパブリックでない場合にも発生する可能性があります

17
Onshop

コントローラ関数をshowUserActionとして定義していますが、定義ではshow[Action]

ルート構成を変更するか

user_show:
    pattern:  /user/{id}
    defaults: { _controller: UserBundle:Default:showUser }
    requirements:
        id:  \d+

またはコントローラの署名を変更します

public function showAction($id)
{

これが役立つかどうかを確認します

3
saamorim

コントローラがサービスとして定義されている場合、受け入れられた答えと同様に、例えば(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」エラーが表示されます。

0
ironchicken

ここではそうではありません。しかし、別の関連する問題があります。

'Action'サフィックスを忘れると、すべて機能します。しかし、サフィックスを忘れてから追加したことに気付いたときは...驚きです! OPと同じエラー。

ここでの問題はキャッシュについてです

SymfonyはURLをキャッシュするために2つのファイルを作成します:

  • AppDevUrlGenerator.php
  • AppDevUrlMatcher.php

アクション名を変更する(つまり、「Action」サフィックスを追加する)と、そのキャッシュ情報は廃止されます。

ソリューション

php app/console cache:clear
0
itrascastro

私の場合、symfony 2を使用していました。

Symfonyの以前のバージョンはメソッドの命名規則を維持しています。メソッドの接尾辞にはAction Wordを含める必要があります。

例:

ルートymlファイルでは、メソッド定義は

docudex_report_make_authorization:
pattern:  /make-authorization
defaults: { _controller: DocudexReportBundle:Default:makeAuthorization }

コントローラーではメソッドは

public function makeAuthorization(){}

したがって、エラーが発生していました。

メソッド名をpublic function makeAuthorizationActionに変更すると、完全に機能しました。

0
sh6210