[英]Concatenated routes, can i do this in laravel 5.2?
有一个包含三个过滤器(位置,类别,事件类型)的提供程序列表,我需要在路由中连接过滤器以使URL更友好,它将像ej。:mysite.com/filter/location/cordoba/eventtype /除草/类别/旅行这些过滤器不是必需的,所以我只能过滤位置,位置和类别,事件类型和类别等。现在我的问题是,我可以在laravel 5.2中做到吗?
我之前这样做:
Route::get('/filtro/localidad/{localidad?}', [
'uses' => 'ProviderController@filterLocation',
'as' => 'site_filter_location_path'
]);
Route::get('/filtro/tipo_evento/{event_type?}', [
'uses' => 'ProviderController@filterEventType',
'as' => 'site_filter_event_type_path'
]);
Route::get('/filtro/rubro/{caption?}', [
'uses' => 'ProviderController@filterCaption',
'as' => 'site_filter_caption_path'
]);
我需要这样的东西(它给我一个错误,我只放了一个或两个参数)
Route::get('/filtro/location/{localidad?}/event_type/{event_type?}/caption/{caption?}', [
'uses' => 'ProviderController@filter',
'as' => 'site_filter_path'
]);
假设我按位置和类别搜索,然后网址将是这样的:mysite.com/location/cordoba/event_type//caption/travel这会生成一个错误的网址,这会给我错误,那我该怎么做呢?
每次缺少参数时,Laravel都不会知道如何找到您的路线,因此您无法真正依赖
Route::get('/filtro/location/{localidad?}/event_type/{event_type?}/caption/{caption?}', [
'uses' => 'ProviderController@filter',
'as' => 'site_filter_path'
]);
你应该有像Route :: get('/ filtro / location / {localidad} / event_type / {event_type} / caption / {caption}',['uses'=>'ProviderController @ filter','as'=> 'site_filter_path']);
所以在这种情况下你可以打电话
/filtro/location/Santito/event_type/Fiesta/caption/false
确保不会缺少参数。
我更喜欢做什么
过滤很难在URL中加入。 每次你有一个新的过滤器,你会得到一个新的网址,这根本不好,因为它很快就会变得混乱。 人们所做的通常是仅为过滤器设置端点,并使用url参数来配置过滤器。 Laravel分页是一种不使用route而是url参数的过滤器。 所以我会这样做
Route::get('/filtro', [
'uses' => 'ProviderController@filter',
'as' => 'site_filter'
]);
还有像这样的控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProviderController extends Controller
{
private function buildFilter($request, $query)
{
if ($localidad = $request->get('localidad')) {
$query->where('localidad', $localidad);
}
if ($tipoEvento = $request->get('tipo_evento')) {
$query->where('tipo_evento', $tipoEvento);
}
...
return $query;
}
public function filter(Request $request)
{
$query = Localidad::newQuery();
$query = $this->buildFilter($request, $query);
$query->where('filter something else');
return view('home', ['data' => $query->get()]);
}
}
然后你只需要使用method="GET"
来制作表格来过滤
<form action="/filtro" method="GET">
...
</form>
你应用程序应该收到像这样的请求
/filtro?localidad=Santa Maria&tipo_evento=Fiesta
如果您需要通过内部过滤器来打自己的路线,您可以执行以下操作:
Route::get('/filter', function () {
$items = [
'localidad' => 'Buenos Aires',
'tipo_evento' => 'Santa Maria',
'rubro' => 'Todos',
];
$items = collect($items)->map(function($item, $key) {
return "$key=$item";
});
$filter = implode('&', $items->toArray());
return redirect()->to('/filter?'$filter);
});
在示例中, $filter
是localidad=Buenos Aires&tipo_evento=Santa Maria&rubro=Todos
,所以它会调用
/filter?localidad=Buenos Aires&tipo_evento=Santa Maria&rubro=Todos
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.