我的路由有点问题.

我正在研究CMS,我需要两条主要路由./admin/(:any).admin控制器用于路由/adminview控制器应用于/admin以外的任何地方.然后,我将从view控制器解析url并显示正确的内容.

这就是我所拥有的:

Route::get(array('admin', 'admin/dashboard'), array('as' => 'admin', 'uses' =>'admin.dashboard@index'));
Route::any('(:any)', 'view@index');

第一条路由可行,但第二条路由不行.我玩了一会儿,似乎如果我用(:any)而不带问号,它只有在/后面加点东西才能行得通.如果我do在那里打个问号,它就完全不起作用了.

我希望以下所有路由都转到view@index:

/
/something
/something/something
/something/something/something
/something/something/something/something
...etc...

如果不硬编码(:any?)/(:any?)/(:any?)/(:any?)个(我甚至不知道它是否有效),这是可能的吗?

最好的办法是什么?

推荐答案

编辑:自从Laravel 4发布以来,关于这个话题有一些困惑,这个答案是针对Laravel 3的.

有几种方法可以做到这一点.

第一种方法是匹配(:any)/(:all?):

Route::any('(:any)/(:all?)', function($first, $rest=''){
    $page = $rest ? "{$first}/{$rest}" : $first;
    dd($page);
});

这不是最好的解决方案,因为它会被分解成多个参数,并且由于某些原因(:all)本身无法工作(bug?)

第二个解决方案是使用正则表达式,在我看来,这比上面的方法更好.

Route::any( '(.*)', function( $page ){
    dd($page);
});

还有一种方法可以让你判断是否有cms页面,即使路由可能已经匹配了其他模式,只要这些路由返回404.此方法修改routes.php中定义的事件侦听器:

Event::listen('404', function() {
    $page = URI::current();
    // custom logic, else
    return Response::error('404');
});

然而,我更喜欢的方法是#2.我希望这有帮助.无论你做什么,都要确保你定义了所有其他的路由,在这些"捕获所有路由"之上,之后定义的任何路由都不会触发.

Php相关问答推荐

从WooCommerce邮箱通知中的订单详细信息中删除产品列表

为什么注册SIGHUP的处理程序函数会阻止在PHP CLI中等待输入时点击X关闭Xterm窗口?""

使用PHP和WebSockets或SSE实现实时通知

在WooCommerce中禁用特定日期之前的免费送货

如何使用这种格式构建XML?

从字符串转换日期和/或时间时,Laravel转换失败

Regex:高级删除单行PHP注释

Shopware 6插件:由于删除了配置密钥,更新后配置值不正确

打折时更改 Woocommerce 产品名称

用户注册表单中的 HTTP 错误 405

订单完成后创建 WooCommerce 促销代码

Woocommerce 相关产品按其类别或排名数学主要类别

根据支付网关选项更改 WooCommerce Checkout 上的立即付款按钮文本

PHP - 计算非数值数组

在WooCommerce中显示 checkout 的高级自定义字段(Advanced Custom Fields)并保存其值

判断类别是否存在 Shopware 6

按前 3 列对二维数组中的行数据进行分组,然后用逗号连接每组中的其余列

PHP/Laravel 中的自定义时区

为什么 8.0 之前的 PHP 版本拒绝命名空间Random\Namespace作为无效语法?

如何通过路由传递变量