具有固定参数值的路由的别名

Posted

技术标签:

【中文标题】具有固定参数值的路由的别名【英文标题】:Alias for a route with a fixed parameter value 【发布时间】:2016-10-15 23:12:02 【问题描述】:

我有这条路线:

Route::get('/MyModel/id', 'MyController@show');

show() 方法接受一个名为id 的参数,我想为/MyModel/1 设置一个别名,以便可以从/MyCustomURL 访问它。

我已经尝试了一些组合,例如:

Route::get('/MyCustomURL', ['uses' => 'MyController@show', 'id' => 1]);

但我不断收到 missing required argument 方法 show() 的错误。

在 Laravel 中是否有一种简洁的方法来实现这一点?

【问题讨论】:

我最近发现了另一种设置路线的方法,无需烦人的“@”。 Route::get('my-model/id', [MyController::class, 'show'])->name('show'); 它为我的 IDE 提供了一个选项,可以从路由器文件中单击打开 MyController 类。 【参考方案1】:

在 Laravel 5.4(或更早版本)中,您可以在路由文件中使用 defaults 函数。

示例如下:

Route::get('/alias', 'MyController@show')->defaults('id', 1);

在这种情况下,您不需要在控制器中添加其他方法。

【讨论】:

这似乎从 Laravel 4.1 版本开始就存在了。我会尝试一下,如果它有效,我会切换到这个答案!谢谢。【参考方案2】:

在同一个控制器中(在你的情况下是 MyController ?)你应该创建一个新方法:

public function showAliased()

   return $this->show(1);

现在你可以像这样定义你的别名路由:

Route::get('/MyCustomURL', 'MyController@showAliased');

【讨论】:

我唯一不喜欢这种方法的是我必须为每个别名设置一个方法。但它实际上回答了这个问题。谢谢。【参考方案3】:

像这样定义你的路线: 您可以使用“as”为您的路线指定您需要的任何名称。

Route::get('/MyModel/id' , [
        'as'=>'Camilo.model.show',
        'uses' => 'MyController@show' ,
    ]) ;

现在如果你想访问这个路由,你可以根据它的名字为它生成 url,如下所示:

route('Camilo.model.show', ['id' =>1]) ;

【讨论】:

我认为这不是我想要的。这是简单的重定向到/MyModel/1 而不是别名。【参考方案4】:
Route::get('MyModel/id', 'MyController@show');

不是

Route::get('/MyModel/id', 'MyController@show');

祝你好运!

【讨论】:

感谢您的提示,但是在路径的开头是否有反斜杠有什么区别? 如果对您有帮助,请接受您的问题的答案;不同的是,第一条路线是:localhost/yourproject/public/MyModel/5 第二条路线是:localhost/yourproject/public//MyModel/5 这就是为什么您的控制器无法处理您的 id 变量。

以上是关于具有固定参数值的路由的别名的主要内容,如果未能解决你的问题,请参考以下文章

根据授权角色创建一个固定值的“字符串字段”?

groovy中具有默认值的命名参数

有没有办法根据派生类的可能性值范围来限制对象参数?

设置一个默认值的参数来路由django中的url

具有默认参数值的打字稿条件返回类型

具有大量局部最小值的多参数优化