Policies: autoryzacja oparta na modelach
Przypisuj policies do modeli Eloquent i używaj ich w kontrolerach
Policies: autoryzacja oparta na modelach to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.
Czym jest Policy?
Policy to klasa, która porządkuje logikę autoryzacji dla konkretnego modelu Eloquent. Policies są zalecane, gdy masz wiele czynności autoryzacji dotyczących tego samego modelu.
Generowanie Policy
Użyj Artisan, aby wygenerować policy. Dodaj --model, aby wstępnie wypełnić standardowe metody.
$ php artisan make:policy PostPolicy --model=PostMetody Policy
Każda metoda odpowiada konkretnej czynności. Otrzymuje uwierzytelnionego użytkownika oraz instancję modelu.
<?php
class PostPolicy
{
public function view(?User $user, Post $post): bool
{
return $post->is_published || $user?->id === $post->user_id;
}
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
public function delete(User $user, Post $post): bool
{
return $user->id === $post->user_id || $user->isAdmin();
}
}Rejestrowanie Policies
W Laravel 11 i nowszych policies są wykrywane automatycznie, jeśli stosują się do konwencji nazewnictwa (model Post → PostPolicy). Możesz je także zarejestrować ręcznie w AuthServiceProvider.
Używanie Policies w kontrolerach
Wywołaj $this->authorize("action", $model) — Laravel automatycznie znajdzie pasującą policy.
<?php
public function update(Request $request, Post $post): RedirectResponse
{
$this->authorize("update", $post);
$post->update($request->validated());
return redirect()->route("posts.show", $post);
}Policy w Blade
Dyrektywa @can działa z policies tak samo jak z gates.
@can('update', $post)
<a href="/posts/{{ $post->id }}/edit">Edit</a>
@endcanMetoda before()
Opcjonalna metoda before() w policy jest wykonywana przed innymi metodami. Zwróć true, aby przyznać pełny dostęp (na przykład administratorom).
<?php
public function before(User $user, string $ability): ?bool
{
if ($user->isAdmin()) return true;
return null; // continue to specific method
}Czynność create (bez instancji modelu)
Metoda policy create otrzymuje tylko użytkownika (bez modelu), ponieważ instancja nie została jeszcze utworzona.
<?php
public function create(User $user): bool
{
return $user->hasVerifiedEmail();
}Ręczne sprawdzanie Policies
Użyj fasady Gate lub modelu użytkownika, aby bezpośrednio sprawdzać policies.
<?php
Gate::allows("update", $post); // true/false
$user->can("update", $post); // true/false
$user->cannot("delete", $post); // true/falseOdpowiedzi Policies
Zwróć obiekt Response z metody policy, aby dostosować komunikat odmowy.
<?php
use Illuminate\Auth\Access\Response;
public function publish(User $user, Post $post): Response
{
return $user->isEditor()
? Response::allow()
: Response::deny("Only editors can publish posts.");
}Testowanie Policies
Testuj policies w PHPUnit, działając jako konkretny użytkownik.
<?php
public function test_owner_can_delete_post(): void
{
$user = User::factory()->create();
$post = Post::factory()->create(["user_id" => $user->id]);
$this->assertTrue($user->can("delete", $post));
}Podsumowanie
Policies grupują autoryzację na poziomie modelu. Generuj je za pomocą make:policy --model. Używaj $this->authorize() w kontrolerach i @can w Blade. Używaj before(), aby omijać kontrole dla administratorów.
Szybkie sprawdzenie
Która metoda policy otrzymuje tylko użytkownika, bez instancji modelu?
Często zadawane pytania
Czy lekcja „Policies: autoryzacja oparta na modelach” jest bezpłatna?
Tak — pełny tekst „Policies: autoryzacja oparta na modelach” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Policies: autoryzacja oparta na modelach”?
Przypisuj policies do modeli Eloquent i używaj ich w kontrolerach Ćwiczysz PHP Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć PHP Academy?
Nie wymagamy żadnego doświadczenia. PHP Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Policies: autoryzacja oparta na modelach”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji PHP Academy?
Tak. Każda lekcja PHP Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Uwierzytelnianie za pomocą Laravel Breeze
- Ochrona tras za pomocą middleware
- Gates: proste sprawdzanie uprawnień
- Policies: autoryzacja oparta na modelach