Метод update
Метод update в классе Policy используется для авторизации действия обновления модели. Он вызывается автоматически при использовании вспомогательной функции authorize или метода can у модели пользователя. Первым параметром передаётся текущий аутентифицированный пользователь, вторым - экземпляр модели, которую планируется обновить. Метод должен вернуть true, если пользователь имеет право на обновление, и false в противном случае.
Синтаксис
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsModel;
class ModelPolicy
{
public function update(User $user, Model $model)
{
return $user->id === $model->user_id;
}
}
?>
Пример
Давайте создадим политику для модели Article и реализуем метод update, который разрешает обновление только автору статьи:
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsArticle;
class ArticlePolicy
{
public function update(User $user, Article $article)
{
return $user->id === $article->user_id;
}
}
?>
Теперь зарегистрируем политику в AuthServiceProvider:
<?php
namespace AppProviders;
use AppModelsArticle;
use AppPoliciesArticlePolicy;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Article::class => ArticlePolicy::class,
];
public function boot()
{
$this->registerPolicies();
}
}
?>
Пример
Давайте используем метод update в контроллере для проверки прав на обновление статьи:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
class ArticleController extends Controller
{
public function update(Request $request, Article $article)
{
$this->authorize('update', $article);
$article->update($request->all());
return redirect()->route('articles.index');
}
}
?>
Результат выполнения кода при успешной проверке:
Redirect to /articles
Результат выполнения кода при неудачной проверке:
IlluminateAuthAccessAuthorizationException
This action is unauthorized.
Пример
Давайте проверим права на обновление с помощью метода can у модели пользователя во вьюхе Blade:
@auth
@if (Auth::user()->can('update', $article))
<a href="{{ route('articles.edit', $article) }}">Edit Article</a>
@endif
@endauth
Результат выполнения кода для автора статьи:
<a href="/articles/1/edit">Edit Article</a>
Результат выполнения кода для неавтора:
(пусто)
Пример
Давайте создадим более сложный метод update, который проверяет не только владельца, но и статус статьи:
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsArticle;
class ArticlePolicy
{
public function update(User $user, Article $article)
{
if ($article->status === 'published') {
return false;
}
return $user->id === $article->user_id;
}
}
?>
Теперь проверим работу метода в контроллере:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;
class ArticleController extends Controller
{
public function update(Request $request, Article $article)
{
if (Auth::user()->cannot('update', $article)) {
abort(403, 'You cannot update this article.');
}
$article->update($request->all());
return redirect()->route('articles.index');
}
}
?>
Результат выполнения кода для опубликованной статьи:
"403 You cannot update this article."