1

コントローラー用に Laravel で動的ルーティングを作成しようとしています。これは Kohana で実行できることはわかっていますが、Laravel で動作させることに失敗しました。

これは私が今持っているものです:

Route::get('/{controller}/{action?}/{id?}'...

ということで、電話したいとcontroller/method($id)思います。

理想的には、これは私がやりたいことです:

Route::get('/{controller}/{action?}/{id?}', $controller . '@' . $action);

そして、$controller::$action を動的に呼び出すようにします。

私はこれをやってみました:

Route::get('/{controller}/{action?}/{id?}', function($controller, $action = null, $id = null)
{
    $controller = new $controller();
    $controller->$action();
});

しかし、エラー メッセージが表示されます。クラス コントローラーが存在しません。そのため、コントローラーが BaseController を拡張するときに、Laravel が必要なすべてのファイルを含めていないようです。

使用$controller::$action()すると、非静的関数を静的に呼び出すことができないことがわかります。

これを機能させる方法についてのアイデアはありますか?

4

2 に答える 2

1

すべてのコントローラーを一気に自動登録できます。

Route::controller( Controller::detect() );

Laravel 4 を使用している場合 (タグが示すように)、もう使用できませController::detect()ん。使用するすべてのコントローラーを手動で登録する必要があります。

于 2013-06-18T02:36:24.573 に答える
0

Laravelがこれをサポートしていないことを読んだ後、私はこの解決策を思いつきました:

$uri = $_SERVER['REQUEST_URI'];
$results = array();
preg_match('#^\/(\w+)?\/?(\w+)?\/?(\w+)?\/?#', $_SERVER['REQUEST_URI'], $results);

// set the default controller to landing
$controller = (empty($results[1])) ? 'landing' : $results[1];

// set the default method to index
$method = (empty($results[2])) ? 'index' : $results[2];

Route::get('{controller?}/{action?}/{id?}', $controller . '@' . $method);

// now we just need to catch and process the error if no controller@method exists.
于 2013-06-21T19:25:08.350 に答える