#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