将硬编码的参数传递到命名的Laravel路线

时间:2016-01-14 22:37:28

标签: php laravel laravel-5 laravel-routing

< p>我正在创建一些硬编码路由,将来可能会再次自由更改。稍微抽象一下这个想法:< / p> < p>我们有一个控制器/方法< code> BuySubscriptionController @start< / code&gt ;:< / p> < pre>< code>类BuySubscriptionController     功能开始()     {         $ plan = Plan :: findBySlug($ request-> get(' plan'));         返回视图(' someView',[' plan' => $ plan]);     } } < /代码>< /预> < p>我们目前有以下路线:< / p> < pre>< code> Route :: get(' / buy-subscription / start',' BuySubscriptionController @ start'); < /代码>< /预> < p>这意味着销售团队需要宣传以下网址:< / p> <预><代码> site.com/buy-subscription/start计划=计划酮 site.com/buy-subscription/start?plan=plan-two < /代码>< /预> < p>现在我们要求有一些专门的路线:< / p> < pre>< code> site.com/purchase/the-basic-plan(plan-one) site.com/purchase/the-mega-plan(plan-two) < /代码>< /预> < p>现在我正在尝试将这些专门的网址添加到我的路线中。我希望按照以下方式执行某些操作,但不起作用:< / p> < pre>< code> Route :: get(' / purchase / the-basic-plan',[    '使用' => ' BuySubscriptionController @开始&#39 ;,    '与' => ['计划' => '计划酮'] ]); Route :: get(' / purchase / the-mega-plan',[    '使用' => ' BuySubscriptionController @开始&#39 ;,    '与' => ['计划' => '计划-2'] ]); < /代码>< /预> < p>有没有办法实现这一点,简单地说,没有过度设计一些新的翻译层?请记住,下周网址可能是< code> / buy / the-god-plan< / code>意思是< code> plan-one< / code&gt ;,所以能够简单地在我的路线上添加一条线似乎是理想的。 < / p为H.

1 个答案:

答案 0 :(得分:0)

您可以定义将计划作为参数的路线,并使用Regular Expression Constraints,以便该参数只能采用您允许的某些值。所以你的路线定义可能如下所示:

Route::get('/purchase/{plan}', 'BuySubscriptionController@start')
     ->name('purchase-plan')
     ->where('plan', 'the-basic-plan|the-mega-plan');

然后在你的控制器动作中使用参数:

class BuySubscriptionController
{
    protected $plans = [
        'the-basic-plan' => 'plan-one',
        'the-mega-plan'  => 'plan-two'
    ];

    function start($plan)
    {
        // You can use an associative array to convert the $plan parameter
        // into the value you need for querying the database
        $plan = Plan::findBySlug($this->plans[$plan]);

        return view('someView', ['plan' => $plan]);
    }
}

如果您需要为路线生成网址,您只需使用route辅助方法并将其传递给计划名称:

route('purchase-plan', 'the-basic-plan');

你会得到:

site.com/purchase/the-basic-plan

此解决方案允许您添加任意数量的计划名称,只需在路径的where约束中添加URL的公共计划,然后将该值与控制器中查询所需的值相关联。 $plans财产。