我正在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'));
}
如何获得能够接受各种可选键/值对的路由?
答案 0 :(得分:1)
为方便起见,请使用GET(?status = ...&... = ...)参数,并在global middleware中对它们进行处理。随着项目的发展,它可能会消除很多混乱。
在中间件中,您可以执行以下操作:
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']
访问项目中任何位置的可能值。如果网址中没有值,则默认为null
。
添加:为了帮助您构建URL的查询参数,您可能需要看看PHP函数http_build_query()
答案 1 :(得分:0)
尝试: 我想解决您的问题
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