我在web.php
创建路线但我需要编辑此路线。
在route.php
:
Route::group(['prefix' => 'flight'], function () {
Route::get('/{fromCity}-{toCity}/{fromDate?}/{toDate?}/{adult?}-{child?}-{infant?}', ['as' => 'flight', 'uses' => 'Site\Flight\IndexController@index'])
->where([
'fromCity' => '[A-Z]+',
'toCity' => '[A-Z]+',
'fromDate' => '\d{4}\-\d{2}\-\d{2}',
'toDate' => '\d{4}\-\d{2}\-\d{2}',
'adult' => '[0-9]+',
'child' => '[0-9]+',
'infant' => '[0-9]+'
]);
});
仅针对此URL
路由工作:
http://localhost:8000/flight/IKA-LON/2017-02-11/2017-02-16/1-0-0
但我需要使用这个`URL:
http://localhost:8000/flight/IKA-LON/2017-02-11/1-0-0
或者:
http://localhost:8000/flight/IKA-LON
如何修改这三个URL
的工作路线?
答案 0 :(得分:2)
您无法跳过可选参数。你可以只留一个空白。但中间人需要在那里。或者你可以留空,或者最后两个。 你无法跳过。
我建议你使用默认值。例如:
http://localhost:8000/flight/IKA-LON/2017-02-11/2017-02-16/1-0-0
http://localhost:8000/flight/IKA-LON/2017-02-11/NOW/1-0-0
http://localhost:8000/flight/IKA-LON/NOW/NOW/1-0-0
您可以使用 NOW 或 TODAY 。或者您认为最适合您的代码。
或使用不同的网址结构:
http://localhost:8000/flight/IKA-LON?from=2017-02-11&to=2017-02-16&adult=1&child=0&infant=0
它不够干净,但你别无选择。你应该使用第一种或第二种方法。
答案 1 :(得分:1)
由于您要求对我的评论进行解释,这里有一个简化的答案:
在web.php(或api.php)中
Route::get('flight', 'FlightController@index');
在FlightController中
function index(Request $request) {
$url_path = str_replace ($request->url(), '', $request->fullUrl());
$url_path_array = explode( '/' , $url_path);
foreach ($url_path_array as $part) {
// do something with the parts (based on regex or order)
// flight regex:
$re1 = '/([A-Z]{3}-[A-Z]{3})/';
// adult etc:
$re2 = '/([0-1]{1}-[0-1]{1}-[0-1]{1})/';
// from and to
$re3 = '/([0-9]{4}-[0-9]{2}-[0-9]{2})/';
}
}
<强> REGEX 强>
((?P<from>[A-Z]{3})-(?P<to>[A-Z]{3}))|((?P<adult>[0-1]{1})-(?P<child>[0-1]{1})-(?P<infant>[0-1]{1}))|(?P<date>[0-9]{4}-[0-9]{2}-[0-9]{2})
答案 2 :(得分:1)
就个人而言,我会用几条路线来实现这个目标:
Route::group(['prefix' => 'flight/{fromCity}-{toCity}'], function () {
// Matches: /flight/IKA-LON
Route::get('/', 'YourController@flights');
// Matches: /flight/IKA-LON/2017-02-11/2017-02-16/1-0-0
Route::get('{fromDate}/{toDate}/{adult}-{child}-{infant}', 'YourController@flightsFromTo');
// Matches: /flight/IKA-LON/2017-02-11/1-0-0
Route::get('{fromDate}/{adult}-{child}-{infant}', 'YourController@flightsFrom');
});
该论坛允许您在所有路线中匹配{fromCity}
和{toCity}
。
在您的控制器中,如果您要在每个路径中显示相同的内容并运行相同的功能,您可以在控制器中创建每个方法调用的方法:
class YourController extends Controller
{
public function doFlights($fromCity, $toCity, $fromDate, $toDate, $adults, $children, $infants)
{
// Do your stuff
}
public function flights($fromCity, $toCity)
{
return $this->doFlights($fromCity, $toCity, date('Y-m-d'), date('Y-m-d'), 1, 0, 0);
}
public function flightsFromTo($fromCity, $toCity, $fromDate, $toDate, $adults, $children, $infants)
{
return $this->doFlights($fromCity, $toCity, $fromDate, $toDate, $adults, $children, $infants);
}
public function flightsFrom($fromCity, $toCity, $fromDate, $adults, $children, $infants)
{
return $this->doFlights($fromCity, $toCity, $fromDate, $fromDate, $adults, $children, $infants);
}
}