Laravel:仅将主要实体绑定到我的会话

Laravel : Bind only primary entities to my session

使用Laravel 5.4

我的应用程序中有以下实体:

员工承包商客户.

我有每个这样的 restfull 路由:

/employees/1
/contractors/1
/clients/1
..

我需要根据路由获取当前实体,所以我在我的 RouteServiceProvider 中做了以下操作:

Route::bind('employee', function ($value) {
    $employee = Employee::findOrFail($value);
    session(['activeEntity' => $employee]);
    return $employee;
});

Route::bind('client', function ($value) {
    $client = Client::findOrFail($value);
    session(['activeEntity' => $client]);
    return $client;
});

Route::bind('contractor', function ($value) {
    $contractor = Contractor::findOrFail($value);
    session(['activeEntity' => $contractor]);
    return $contractor;
});

这适用于所有顶级路由。但我也有以下路线:

/clients/1/employees/1

在这种情况下,我希望 activeEntity 为 Client,但当前会话中的活动实体将设置为 Employee

我该如何防止这种情况发生?并将正确的实体绑定到会话?

我建议通过中间件来处理它。您可以使用 handle() 方法创建 SetActiveEntityMiddleware,如下所示:

public function handle($request, Closure $next, $guard = null)
{
    if ($request->is('employees/*')) {
        $id = $request->route()->parameter('employee');

        $employee = Employee::findOrFail($id);

        session(['activeEntity' => $employee]);
    }

    if ($request->is('clients/*')) {
        $id = $request->route()->parameter('client');

        $client = Client::findOrFail($id);

        session(['activeEntity' => $client]);
    }

    if ($request->is('contractors/*')) {
        $id = $request->route()->parameter('contractor');

        $contractor = Contractor::findOrFail($id);

        session(['activeEntity' => $contractor]);
    }

    return $next($request);
}

这里是LaravelMiddleware Docs.