我为一个有很多类似路线的应用编写路由,我想保持干燥,所以我想根据网址的一部分选择控制器,但是没有&#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
?
答案 0 :(得分:5)
要以动态方式使用它,你可以这样做:
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";
}
}
您可以根据路线参数创建代理控制器以查找控制器:
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();
});