我在路由方面遇到了一些麻烦。
我正在使用CMS,需要两条主要路线。/admin和/(:any)。该admin控制器用于路由/admin和view控制应该用于任何东西比其他/admin。view然后,从控制器中,我将解析URL并显示正确的内容。
/admin
/(:any)
admin
view
这就是我所拥有的:
Route::get(array('admin', 'admin/dashboard'), array('as' => 'admin', 'uses' =>'admin.dashboard@index')); Route::any('(:any)', 'view@index');
第一条路线有效,但第二条路线无效。我稍微玩了一下,看来如果我(:any)不带问号使用,只有在之后放一些东西,它才能起作用/。如果我 确实 把问号放在那儿,那根本不起作用。
(:any)
/
我希望以下所有路线都转到view @ index:
/ /something /something/something /something/something/something /something/something/something/something ...etc...
如果不对一堆(:any?)/(:any?)/(:any?)/(:any?)(我什至不知道有效的)进行硬编码,这是否可能?
(:any?)/(:any?)/(:any?)/(:any?)
最好的方法是什么?
编辑:自从Laravel 4发布以来,关于此主题一直存在一些困惑,此答案针对的是Laravel 3。
有几种方法可以解决此问题。
第一种方法是匹配(:any)/(:all?):
(:any)/(:all?)
Route::any('(:any)/(:all?)', function($first, $rest=''){ $page = $rest ? "{$first}/{$rest}" : $first; dd($page); });
这不是最佳解决方案,因为它分为多个参数,并且由于某种原因(:all)本身无法运行(错误?)
第二种解决方案是使用正则表达式,我认为这是比上面更好的方法。
Route::any( '(.*)', function( $page ){ dd($page); });
还有另一种方法,即使这些路由返回了404,即使路由可能已经匹配了其他模式,它也可以让您检查是否有cms页。该方法修改了在routes.php以下方法中定义的事件侦听器:
routes.php
Event::listen('404', function() { $page = URI::current(); // custom logic, else return Response::error('404'); });
但是,我的首选方法是#2。我希望这有帮助。无论您做什么,都要确保在这些路由之上定义所有其他路由,以捕获所有路由,之后定义的任何路由都将永远不会触发。