将硬编码值从路由传递到控制器的正确方法 (Laravel)?
Proper way to pass a hard-coded value from route to controller (Laravel)?
我有一个 PagesController
,只有一个动作:view
。
此操作接受 page
参数。
我想达到的目标:
有路线 example.com/about
和 example.com/foobar
。
当触发其中一个路由时,将路由文件中预定义的值传递给 PagesController@view
.
在我的路线文件中:
Route::get('about', function () {
return App::make('App\Http\Controllers\PagesController')->view('about');
})->name('aboutPage');
Route::get('foobar', function () {
return App::make('App\Http\Controllers\PagesController')->view('foobar');
})->name('foobarPage');
按预期工作,但我想知道是否有更好更合适的方法来实现相同的功能?
将您的页面作为路由参数传递:
Route::get('{page}', 'PagesController@view');
//controller
public function view($page)
{
//$page is your value passed by route;
return view($page);
}
所以你只是想为你的行为争论不休。如果该参数可以为空,则可以使用可选参数。您可以阅读更多相关信息 here。
Route::get('{argument?}', 'PagesController@view')->name('page');
在你的PagesController
中:
public function view($argument = 'default') {
// Your logic
}
如果您不需要像示例中那样的路由名称
->name('foobarPage');
你可以使用这样的东西
Route::get('{page_name}','PagesController@view')->where('page_name', '(about)|(foobar)');
这将只接受在 page_name 参数的正则表达式中传递的值。其他路由会抛出 404 错误。我应该提一下,这种技术似乎只对具有一层 url 嵌套的应用程序有效,并且 不应用作模式。
根据我在上面看到的内容,如果您所做的只是显示正确的视图,我会选择
Route::get('{page}', function($page)
{
if (view()->exists($page)) {
return view($page);
}
return abort(404);
});
这甚至可以防止您在控制器中需要一个方法。
接受的答案是根据您正在做的事情得到您想要的。
如果您真的想要一个硬编码值,您可以根据需要使用路由的 'actions' 数组部分。
Route::get('something', ['uses' => 'Controller@page', 'page' => 'something']);
public function page(Request $request)
{
$page = $request->route()->getAction()['page'];
...
}
我有一个 PagesController
,只有一个动作:view
。
此操作接受 page
参数。
我想达到的目标:
有路线 example.com/about
和 example.com/foobar
。
当触发其中一个路由时,将路由文件中预定义的值传递给 PagesController@view
.
在我的路线文件中:
Route::get('about', function () {
return App::make('App\Http\Controllers\PagesController')->view('about');
})->name('aboutPage');
Route::get('foobar', function () {
return App::make('App\Http\Controllers\PagesController')->view('foobar');
})->name('foobarPage');
按预期工作,但我想知道是否有更好更合适的方法来实现相同的功能?
将您的页面作为路由参数传递:
Route::get('{page}', 'PagesController@view');
//controller
public function view($page)
{
//$page is your value passed by route;
return view($page);
}
所以你只是想为你的行为争论不休。如果该参数可以为空,则可以使用可选参数。您可以阅读更多相关信息 here。
Route::get('{argument?}', 'PagesController@view')->name('page');
在你的PagesController
中:
public function view($argument = 'default') {
// Your logic
}
如果您不需要像示例中那样的路由名称
->name('foobarPage');
你可以使用这样的东西
Route::get('{page_name}','PagesController@view')->where('page_name', '(about)|(foobar)');
这将只接受在 page_name 参数的正则表达式中传递的值。其他路由会抛出 404 错误。我应该提一下,这种技术似乎只对具有一层 url 嵌套的应用程序有效,并且 不应用作模式。
根据我在上面看到的内容,如果您所做的只是显示正确的视图,我会选择
Route::get('{page}', function($page)
{
if (view()->exists($page)) {
return view($page);
}
return abort(404);
});
这甚至可以防止您在控制器中需要一个方法。
接受的答案是根据您正在做的事情得到您想要的。
如果您真的想要一个硬编码值,您可以根据需要使用路由的 'actions' 数组部分。
Route::get('something', ['uses' => 'Controller@page', 'page' => 'something']);
public function page(Request $request)
{
$page = $request->route()->getAction()['page'];
...
}