У меня возникли проблемы с созданием промежуточного программного обеспечения «владелец».
Например, у меня есть модель Articles
и User
связанная с ключом user_id
.
Я хочу добавить промежуточное программное обеспечение «владелец» в ArticlesController
, поэтому единственный владелец этой статьи может редактировать, обновлять и удалять его.
Я искал эту проблему некоторое время, но так и не нашел код, который бы сработал. Некоторые из них пытались заставить его работать с запросами формы, но я заинтересован в использовании Middleware.
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); } }
app\Http\Kernel.php
: protected $routeMiddleware = [ 'owner' => 'App\Http\Middleware\OwnerMiddleware', ];
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']]); }