Метод view
Метод view класса Policy отвечает за проверку права пользователя на просмотр конкретной модели. Этот метод автоматически вызывается при использовании помощника can или директивы @can с моделью в качестве второго аргумента. Первым параметром метод принимает текущего аутентифицированного пользователя, вторым - экземпляр модели, которую пользователь хочет просмотреть.
Синтаксис
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsArticle;
class ArticlePolicy
{
public function view(User $user, Article $article)
{
// logic
}
}
?>
Пример
Рассмотрим простой пример политики для модели Article, где пользователь может просматривать только свои собственные статьи:
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsArticle;
class ArticlePolicy
{
public function view(User $user, Article $article)
{
return $user->id === $article->user_id;
}
}
?>
Теперь используем эту политику в контроллере для проверки доступа:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function show(Request $request, $id)
{
$article = Article::findOrFail($id);
if ($request->user()->cannot('view', $article)) {
abort(403, 'You cannot view this article.');
}
return view('articles.show', ['article' => $article]);
}
}
?>
Альтернативный способ с использованием метода authorize:
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function show(Request $request, $id)
{
$article = Article::findOrFail($id);
$this->authorize('view', $article);
return view('articles.show', ['article' => $article]);
}
}
?>
Пример
Метод view может также использоваться для проверки статуса модели:
<?php
namespace AppPolicies;
use AppModelsUser;
use AppModelsArticle;
class ArticlePolicy
{
public function view(User $user, Article $article)
{
return $article->status === 'published' || $user->id === $article->user_id;
}
}
?>
Это позволяет разрешать просмотр опубликованных статей всем пользователям, а неопубликованных - только их авторам.
<?php
namespace AppHttpControllers;
use AppModelsArticle;
use IlluminateHttpRequest;
class ArticleController extends Controller
{
public function show(Request $request, $id)
{
$article = Article::findOrFail($id);
if ($request->user()->can('view', $article)) {
return view('articles.show', ['article' => $article]);
}
return redirect()->route('home');
}
}
?>
Пример
Использование метода view в Blade-шаблоне с директивой @can:
@foreach ($articles as $article)
<div>
<h3>{{ $article->title }}</h3>
<p>{{ $article->excerpt }}</p>
@can('view', $article)
<a href="{{ route('articles.show', $article) }}">Read more</a>
@endcan
</div>
@endforeach
Также можно использовать директиву @cannot для обратной проверки:
<h1>{{ $article->title }}</h1>
<p>{{ $article->content }}</p>
@cannot('view', $article)
<p>You do not have permission to view this article.</p>
@endcannot
@can('view', $article)
<p>This is the full content of the article.</p>
@endcan
Результат выполнения для авторизованного пользователя, который является автором статьи:
<h1>My Article Title</h1>
<p>This is the full content of the article.</p>
А для пользователя, который не является автором статьи и статья не опубликована:
<h1>Draft Article</h1>
<p>You do not have permission to view this article.</p>