动态选择控制器

时间:2014-04-15 20:29:58

标签: laravel laravel-4

我为一个有很多类似路线的应用编写路由,我想保持干燥,所以我想根据网址的一部分选择控制器,但是没有&#39 ;似乎是一种用Laravel来做这件事的方法。

这不起作用,因为$report_slug不可用。

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

如果我使用闭包,我可以访问$report_slug,但我无法找到任何替换return的文档,因此这将返回控制器和操作的文本,但显然我想用这个动作。

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

如何根据report_slug

指定控制器

2 个答案:

答案 0 :(得分:5)

选项1

要以动态方式使用它,你可以这样做:

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

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

class FooController extends Controller {

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

}

选项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);
    }

}

这是路线:

Route::any('ad-reports/{report_slug}', 'ProxyController@bar');

这是一个控制器示例:

class FooReportController extends Controller {

   public function bar()
   {
       return 'generated by foo report!';
   }
}

你只需要点击

http://yourdomain.com/ad-reports/foo

要看:

generated by foo report!

答案 1 :(得分:4)

您可以在下面的路线中调用App :: make。它可以随心所欲地工作

Route::get('/ad-reports/{report_slug}', function($report_slug) {
return App::make($report_slug.'Controller')->showHome();
});