我正在为一个有很多类似路线的应用编写路由,我想保持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
?指定控制器?
要以动态方式使用它,您可以:
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)
您可以创建代理控制器以根据路由参数查找控制器:
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)