Передача нескольких необязательных пар ключ / значение в URL с помощью Laravel

#laravel #laravel-5 #routes

#laravel #laravel-5 #маршруты

Вопрос:

Я создаю приложение для управления проектами в Larvel. TaskController@index запрашивает базу данных и возвращает задачи. Чтобы быть эффективным и элегантным, я хочу иметь возможность передавать ему несколько необязательных пар ключ / значение в URL, например /tasks/org_id/36/status /open или / tasks/proj_id / 1557/status/ closed, и чтобы он возвращал задачи на основе этих переменных. Мой код приведен ниже, но проблема заключается в том, чтобы маршрут мог получать необязательные пары ключ / значение. Кроме того, не обязательно отправлять их все одновременно, если они не нужны.

Route/web.php:

 Route::get('/tasks/status/{status}/proj_id/{proj_id}/user_id/{user_id}/org_id/{org_id}
/creator_id/{creator_id}', 'TaskController@index')->name('tasks.index');

Route::resource('tasks', 'TaskController')->except([
    'tasks.index'
]);
  

Контроллер:

 class TaskController extends Controller
{

    public function index($proj_id = null, $recipient_id = null, $org_id = null, $creator_id = null, $status = null)
    {

        $tasks = Task::where('recipient_id', auth()->user()->id)
            ->when($status, function ($query, $status) {
                return $query->where('status', $status);
            })
            ->when($recipient_id, function ($query, $recipient_id) {
                return $query->where('recipient_id', $recipient_id);
            })
            ->when($public, function ($query, $public) {
                return $query->where('public', $public);
            })
            ->get();

        return view('tasks.index', compact('tasks'));
    }
  

Как мне заставить маршрут принимать различные необязательные пары ключ / значение?

Комментарии:

1. Просто отметим, что ни один из этих параметров не является необязательным; для этого они должны иметь знак вопроса, например {param?} . Но, как говорится, это просто нарывается на неприятности… Объединение необязательных параметров маршрута в цепочку завершится ошибкой, как только один из них будет проигнорирован. Подумайте об изменении этого, чтобы использовать POST логику или правильную строку запроса, например ?status=statusamp;proj_id=...

2. вы можете использовать знак вопроса .., чтобы установить этот параметр как необязательный. /задачи/статус/{status?}/proj_id/{proj_id?}/user_id/{user_id?}/org_id/{org_id?} /creator_id/{creator_id?}

3. Честно говоря, это, вероятно, лучше подходит для GET params .

Ответ №1:

Для вашего удобства работайте с параметрами GET (?status=…amp;…=…) и обрабатывайте их в глобальном промежуточном программном обеспечении. Возможно, это устранит большую путаницу по мере роста вашего проекта.

В промежуточном программном обеспечении вы могли бы сделать что-то вроде этого:

 public function handle($request, Closure $next)
    {
        $params = array();

        //OR look them up individually:
        $params['status'] = $request->query('status');
        $params['proj_id'] = $request->query('proj_id');
        $params['org_id'] = $request->query('org_id');

        //OR get all query requests at once:
        $params = $request->query();

        //and set them as a session value
        $request->session()->put('params', $params);

        return $next($request);
    }
  

Получите доступ к возможным значениям в любом месте проекта с помощью помощника session('params')['status'] . Если в URL-адресе нет значения, оно по умолчанию равно null .

Дополнение: чтобы помочь вам в создании параметров запроса для URL, вы можете взглянуть на PHP-функцию http_build_query()

Ответ №2:

попробуйте это: я думаю, это решит вашу проблему

 Route::resource('tasks', 'TaskController')->except([
    'index'
]);

Route::get('/tasks/status/{status}/proj_id/{proj_id}/user_id/{user_id}/org_id/{org_id}
/creator_id/{creator_id}', 'TaskController@index');
  

я надеюсь помочь вам

https://laracasts.com/discuss/channels/laravel/routeresource-parameters