繁体   English   中英

连接路线,我可以在laravel 5.2中这样做吗?

[英]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);
});

在示例中, $filterlocalidad=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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM