【问题标题】:Laravel 4 route with unlimited number of parametersLaravel 4路线,参数数量不受限制
【发布时间】:2014-02-26 15:54:21
【问题描述】:

我正在尝试为无限数量的 URL 级别创建动态路由。

这是我目前的路线

Route::get('{pageLink}', array('uses' => 'SiteController@getPage'));

这适用于第一级。所以像 something.com/foo/ 这样的 URL 可以工作。但是,如果我有类似 something.com/foo/bar/ 的东西,它就不会捕获那个 URL。我需要它来匹配无限级别。这样,在我的控制器中,无论整个链接是什么,它都会给我一个变量。

我知道我能做到

Route::get('{pageLink}', array('uses' => 'SiteController@getPage'));
Route::get('{pageLink}/{pageLink2}', array('uses' => 'SiteController@getPage'));
Route::get('{pageLink}/{pageLink2}/{pageLink3}', array('uses' => 'SiteController@getPage'));

但这似乎有点矫枉过正。有没有更好的方法来做到这一点,让它匹配到 URL 的末尾?

谢谢。

【问题讨论】:

    标签: php laravel laravel-4 laravel-routing


    【解决方案1】:

    @Fusion https://laravel.com/docs/5.4/routing

    您可以使用路由实例上的 where 方法来限制路由参数的格式。 where 方法接受参数的名称和定义如何约束参数的正则表达式。所以{id} 是一个路由参数,->where('id', '[0-9]+') 是这个参数的正则表达式。如果您需要使用多个参数,您可以执行以下操作:

    Route::get('user/{id}/{id2}', function ($id) { })->where('id', '[0-9]+')->where('id2', '[[0-9]+]');
    
    
        Route::get('user/{id}', function ($id) {
    
        })->where('id', '[0-9]+');
    

    【讨论】:

    • 添加 cmets 并解释你的答案。
    • 您可以使用路由实例上的 where 方法来限制路由参数的格式。 where 方法接受参数的名称和定义如何约束参数的正则表达式。所以 {id} 是一个路由参数, ->where('id', '[0-9]+') 是这个参数的正则表达式。如果您需要使用多个参数,您可以执行以下操作:Route::get('user/{id}/{id2}', function ($id) { })->where('id', '[ 0-9]+')->where('id2', '[[0-9]+]');
    【解决方案2】:

    你可以试试这样的:

    //routes.php
    Route::get('{pageLink}/{otherLinks?}', 'SiteController@getPage')->where('otherLinks', '(.*)');
    

    请记住将上述内容放在 routes.php 文件的最后(底部),因为它就像一条“包罗万象”的路线,因此您必须首先定义所有“更具体”的路线。

    //controller 
    class SiteController extends BaseController {
    
        public function getPage($pageLink, $otherLinks = null)
        {
            if($otherLinks) 
            {
                $otherLinks = explode('/', $otherLinks);
                //do stuff 
            }
        }
    
    }
    

    这种方法应该让您使用无限数量的参数,所以这就是您似乎需要的。

    【讨论】:

    • 究竟是什么?在 {} 中是什么意思?
    • 这意味着它是可选的@Riki137
    • 不错的方法,即使对 Laravel 5 也有效。你能解释一下 where('otherLinks', '(.*)') 是如何工作的吗?
    猜你喜欢
    • 2014-01-11
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2018-11-22
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多