动态选择控制器

ico*_*ast 0 laravel laravel-4

我正在为一个有很多类似路线的应用编写路由,我想保持DRY,所以我想根据URL的一部分选择控制器,但似乎没有办法与Laravel一起做这件事.

这不起作用,因为$report_slug它不可用.

Route::get('/ad-reports/{report_slug}', array('uses' => Str::title($report_slug).'Controller@showHome'));
Run Code Online (Sandbox Code Playgroud)

如果我使用一个我可以访问的闭包$report_slug,但我找不到任何替换内容的文档return,所以这将返回控制器和操作的文本,但显然我想使用该操作.

Route::get('/ad-reports/{report_slug}', function($report_slug) {
   return (Str::title($report_slug).'Controller@showHome');
});
Run Code Online (Sandbox Code Playgroud)

如何根据report_slug?指定控制器?

Ant*_*iro 5

选项1

要以动态方式使用它,您可以:

Route::get('ad-reports/{report_slug}', Str::title(Request::segment(2)).'Controller@run');
Run Code Online (Sandbox Code Playgroud)

为我工作,这是我用来测试这条路线的控制器:

class FooController extends Controller {

    public function run()
    {
        return "this is a dynamic controller call";
    }

}
Run Code Online (Sandbox Code Playgroud)

选项2

您可以创建代理控制器以根据路由参数查找控制器:

class ProxyController extends Controller {

    public function __call($name, $arguments)
    {
        $class = Str::title($arguments[0]).'ReportController';

        array_shift($arguments);

        $controller = new $class;

        return call_user_func_array(array($controller, $name), $arguments);
    }

}
Run Code Online (Sandbox Code Playgroud)

这是路线:

Route::any('ad-reports/{report_slug}', 'ProxyController@bar');
Run Code Online (Sandbox Code Playgroud)

这是一个控制器示例:

class FooReportController extends Controller {

   public function bar()
   {
       return 'generated by foo report!';
   }
}
Run Code Online (Sandbox Code Playgroud)

而你只需要打

http://yourdomain.com/ad-reports/foo
Run Code Online (Sandbox Code Playgroud)

查看:

generated by foo report!
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案,所以我觉得我欠你一个解释,为什么我选择穆哈雷姆的答案。虽然他的内容有点冗长,但也更清晰一些,如果您重构路由,可能会更容易,因为 `$report_slug` 在闭包内可用,但在 `Route:: 的第二个参数内不可用。尽管如此,*谢谢*您的帮助:我真的很感激。 (2认同)