2017-10-27 5 views
1

こんにちは。私はSilex(2.0)を初めて使っているので、$ app変数を私のコントローラに渡そうとしているので、サービスとしてコントローラを作成しようとしています。Silex - ControllerResolverのInvalidArgumentException

私はdocumentation guideに従っていますが、私のコントローラーを登録するときに、タイプのエラーが発生します。InvalidArgumentException:クラス "controller。default"が存在しません。私のindex.phpに

enter image description here

$app->register(new Silex\Provider\ServiceControllerServiceProvider()); 
// Register controller as services. 
$app['controller.default'] = function() use ($app) { 
    return new Fortunio\Controller\DefaultController($app); 
}; 
$app->get('/', "controller.default::indexAction"); 

私は、コードの最後の行を変更した場合、アプリケーションがスムーズに実行し、エラーが消える:私のコントローラ上の

$app->get('/', 'Fortunio\Controller\DefaultController::indexAction'); 

を:

<?php 

namespace Fortunio\Controller; 

use Silex\Application; 
use Symfony\Component\HttpFoundation\Request; 

class DefaultController 
{ 
    public function indexAction(Application $app, Request $request) 
    { 
     // my controller code here 
    } 
} 

私のミスはどこですか?

ありがとうございます。

答えて

1

まずはうまく入れてください。

私がドキュメントに従っているのを見る限り、彼らはうまくいくと主張すればあなたのコードはうまくいくはずです。つまり、これはではなく、コントローラをサービスとして使用するアプローチです。我々のアプローチは、より多くのこのようなものです:

class ControllerProvider implements ServiceProviderInterface 
{ 
    public function register(Application $app) 
    { 
     $app['controller.thing'] = function ($app) { 
      return new ThingController(); 
     }; 
    } 
} 

class RouteProvider implements ServiceProviderInterface 
{ 
    public function register(Application $app) 
    { 
     $app->get('/thing/{id}/', function (Request $request) use ($app) { 
      return $app['controller.thing']->doGET($request); 
     })->assert('id', '\d+'); 
    } 
} 

use Silex\Application as SilexApplication; 

class Application extends SilexApplication 
{ 
    public function __construct() 
    { 
     $this->register(new ControllerProvider()); 
     $this->register(new RouteProvider()); 
    } 
} 

$app = new Application(); 

主な違いは、このビットはRouteProviderで、次のとおりです。ちょうどcontroller.thing:doGET

$app->get('/thing/{id}/', function (Request $request) use ($app) { 
    return $app['controller.thing']->doGET($request); 
})->assert('id', '\d+'); 

たちは、コントローラのサービス(すなわちへの文字列参照を使用していない参照してください。 )、DIコンテナ内のコントローラへの実際の参照を使用し、実際にはクロージャのメソッドを呼び出します。

ドキュメントのバージョンが実際に動作しているかどうかを確認したいが、私の仕事に戻る必要がある。私はそれを後にして、それを働かせるかどうかの調査結果に戻ってきます。私はに持っていましたが、これまではcontroller.thing:doGETのアプローチが働いていましたが、それでも私のアプローチ(Silex 1.xを使用)は少し異なりました。ブログの記事はPHP: Silex Controller Providersですが、これ以上のアプローチは勧められません。私は、その構文が機能することを証明するためにそれを含めるだけです。

+1

こんにちは@AdamCameron、リファレンスガイドの指示に正しく従っている場合は、何も問題はありませんあなたが言ったように、あなたの助けを大変ありがとうございます。私の間違いはコロン(:)を使用することでした。コントローラーをその名前とアクションで使用するのはMy \ Controller :: myAction(二重コロン)の構文を使用しますが、コントローラーをサービスとして使うにはコロン 'my.controller :myAction ' コロンの使用を修正すると、エラーは消え、アプリケーションは円滑に実行されます。 よろしくお願いいたします。 –

+0

母、私はそれを見つけなかった!与えられた状況のための大きなエラーメッセージではないですか?あなたがそれを整理してうれしいです。 –

関連する問題