Промежуточное программное обеспечение Laravel 5 «Владелец»?

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

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

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

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

2

Решение

  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
});
6

Другие решения

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

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

Вот промежуточное ПО (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']]);
}
4

По вопросам рекламы [email protected]