Laravel 5 Middleware «Владелец»?

У меня возникли проблемы с созданием промежуточного программного обеспечения «владелец».

Например, у меня есть модель Articles и User связанная с ключом user_id .

Я хочу добавить промежуточное программное обеспечение «владелец» в ArticlesController , поэтому единственный владелец этой статьи может редактировать, обновлять и удалять его.

Я искал эту проблему некоторое время, но так и не нашел код, который бы сработал. Некоторые из них пытались заставить его работать с запросами формы, но я заинтересован в использовании Middleware.

  1. Создание промежуточного программного обеспечения:
 php artisan make:middleware OwnerMiddleware 
 namespace App\Http\Middleware; use App\Article; use Closure; use Illuminate\Contracts\Auth\Guard; class OwnerMiddleware { /** * The Guard implementation. * * @var Guard */ protected $auth; /** * Create a new filter instance. * * @param Guard $auth * @return void */ public function __construct(Guard $auth) { $this->auth = $auth; } /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $articleId = $request->segments()[1]; $article = Article::findOrFail($articleId); if ($article->user_id !== $this->auth->getUser()->id) { abort(403, 'Unauthorized action.'); } return $next($request); } } 
  1. Добавьте его в app\Http\Kernel.php :
 protected $routeMiddleware = [ 'owner' => 'App\Http\Middleware\OwnerMiddleware', ]; 
  1. Используйте промежуточное ПО в своих маршрутах:
 Route::group(['middleware' => ['owner']], function() { // your route }); 

В качестве альтернативы вы можете использовать параметры маршрута и промежуточного программного обеспечения , он имеет ряд преимуществ:

  • Даже если структура запроса изменится, ваше промежуточное ПО все еще будет работать
  • Средство промежуточного уровня многократно используется для разных ресурсов
  • Вы можете использовать его внутри контроллеров

Вот промежуточное ПО ( app/Http/Middleware/AbortIfNotOwner.php ):

 <?php namespace App\Http\Middleware; use Closure; class AbortIfNotOwner { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string $resourceName * @return mixed */ public function handle($request, Closure $next, $resourceName) { $resourceId = $request->route()->parameter($resourceName); $user_id = \DB::table($resourceName)->find($resourceId)->user_id; if ($request->user()->id != $user_id) { abort(403, 'Unauthorized action.'); } return $next($request); } } 

Внутри app\Http\Kernel.php :

 protected $routeMiddleware = [ 'owner' => 'App\Http\Middleware\AbortIfNotOwner', ]; 

Внутри файла маршрута ( app/Http/routes.php ):

 Route::group(['middleware' => ['owner:articles']], function() { // your route }); 

И, возможно, назовите его в контроллере:

 public function __construct() { $this->middleware('owner:articles', ['only' => ['edit', 'update']]); }