使用Laravel在URL中传递几个可选的键/值对

时间:2019-03-05 19:13:56

标签: laravel laravel-5 routes

我正在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'));
    }

如何获得能够接受各种可选键/值对的路由?

2 个答案:

答案 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