Laravel (5) - 使用可选参数路由到控制器
Posted
技术标签:
【中文标题】Laravel (5) - 使用可选参数路由到控制器【英文标题】:Laravel (5) - Routing to controller with optional parameters 【发布时间】:2015-07-06 16:17:51 【问题描述】:我想创建一个采用所需 ID 和可选开始和结束日期 ('Ymd') 的路线。如果省略日期,则它们会退回到默认值。 (说过去 30 天)并调用控制器....让我们说 'path@index'
Route::get('/path/id/start?/end?', function($id, $start=null, $end=null)
if(!$start)
//set start
if(!$end)
//set end
// What is the syntax that goes here to call 'path@index' with $id, $start, and $end?
);
任何帮助将不胜感激。我确信有一个简单的答案,但我在任何地方都找不到任何东西。
提前感谢您的帮助!
【问题讨论】:
【参考方案1】:无法从 Route:::get
闭包中调用控制器。
用途:
Route::get('/path/id/start?/end?', 'Controller@index');
并在控制器函数中处理参数:
public function index($id, $start = null, $end = null)
if (!$start)
// set start
if (!$end)
// set end
// do other stuff
【讨论】:
如果发送了两个参数之一,是否会设置为 $start,因为这是路由中定义的第一个参数?【参考方案2】:我会用 三个 路径来处理它:
Route::get('/path/id/start/end, ...);
Route::get('/path/id/start, ...);
Route::get('/path/id, ...);
注意顺序 - 你要先检查完整路径。
【讨论】:
这里唯一的问题是这种情况:Route::get('/path/id/end, ...);由于您已经定义了这条路线:Route::get('/path/id/start, ...); 有趣,但从功能上讲,如果只提供一个日期,代码将无法知道该日期是结束日期还是开始日期。程序员必须做出决定。 你是绝对正确的。 :) 我对此进行了更多阅读并了解当它们是多个可选参数时,您始终需要设置前面的参数以考虑以下参数。这有效地使您的三个路线正确。【参考方案3】:您可以像这样从路由闭包中调用控制器操作:
Route::get('slug', function ($slug, Request $request)
$app = app();
$locale = $app->getLocale();
// search for an offer with the given slug
$offer = \App\Offer::whereTranslation('slug', $slug, $locale)->first();
if($offer)
$controller = $app->make(\App\Http\Controllers\OfferController::class);
return $controller->callAction('show', [$offer, $campaign = NULL]);
else
// if no offer is found, search for a campaign with the given slug
$campaign = \App\Campaign::whereTranslation('slug', $slug, $locale)->first();
if($campaign)
$controller = $app->make(\App\Http\Controllers\CampaignController::class);
return $controller->callAction('show', [$campaign]);
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
);
【讨论】:
【参考方案4】:我所做的是将可选参数设置为 query 参数,如下所示:
示例网址:
/getStuff/2019-08-27?type=0&color=red
路线:
Route::get('/getStuff/date','Stuff\StuffController@getStuff');
控制器:
public function getStuff($date)
// Optional parameters
$type = Input::get("type");
$color = Input::get("color");
【讨论】:
@Michael Pittino 的回答是做到这一点的最佳实践方式【参考方案5】:这帮助我简化了可选的路由参数(来自 Laravel 文档):
有时您可能需要指定一个路由参数,但该路由参数的存在是可选的。您可以通过放置一个 ?在参数名称后标记。确保给路由对应的变量一个默认值:
Route::get('user/name?', function ($name = null)
return $name;
);
Route::get('user/name?', function ($name = 'John')
return $name;
);
或者,如果您的路线中有控制器调用操作,那么您可以这样做:
web.php
Route::get('user/name?', 'UsersController@index')->name('user.index');
userscontroller.php
public function index($name = 'John')
// Do something here
我希望这有助于有人像我一样简化可选参数!
Laravel 5.6 Routing Parameters - Optional parameters
【讨论】:
赞成,这可能是一个解决方案,但不是一个完美的解决方案。【参考方案6】:Route::get('user/name?', function ($name = null)
return $name;
);
在此处查找更多详细信息 (Laravel 7):https://laravel.com/docs/7.x/routing#parameters-optional-parameters
【讨论】:
以上是关于Laravel (5) - 使用可选参数路由到控制器的主要内容,如果未能解决你的问题,请参考以下文章