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

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

Маршрут / 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'));
    }

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

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Для вашего удобства работайте с параметрами GET (? Status = ... & ... = ...) и работайте с ними в глобальном промежуточном программном обеспечении . Это может устранить много путаницы по мере роста вашего проекта.

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

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 ()

0 голосов
/ 05 марта 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...