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.
使用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.