Я создаю политику для модели todo, чтобы авторизовать роль пользователя, а затем установить индивидуальный доступ для функций модели, таких как create(), update() и т. д. Как написано в документации Laravel, мы можем создать политику для модели todo с помощью php artisan make:policy todoPolicy --model=todo.
Когда мы используем имя модели + Политика в качестве имени нашей политики, которая находится в папке App\Policies, Laravel автоматически регистрирует их для модели, как мы использовали todoPolicy для модели todo.
Кроме того, чтобы проверить, работает эта политика или нет, я установил return true; для функции create() в файле todoPolicy и вызываю $this->authorize('create,' todo::class); в функции добавления компонента для ее тестирования.
Но всегда возвращает 403, а не авторизованную страницу. В чем проблема с моим кодом?
Компонент/контроллер
namespace App\Livewire\Elements\Todolist;
use Livewire\Component;
use App\Models\todo;
class Todolist extends Component
{
public $description;
public function done($id) {
sleep(0.5);
todo::where('id',$id)->first()->update([
'is_done' => true,
]);
}
public function restore($id) {
sleep(0.5);
todo::where('id',$id)->first()->update([
'is_done' => false,
]);
}
public function delete($id) {
sleep(0.5);
todo::where('id',$id)->first()->delete();
}
public function add(todo $todo) {
$this->authorize('create',$todo);
$this->validate([
'description' => ['required','max:128'],
]);
sleep(0.5);
todo::create([
'user_id' => session('user_id'),
'description' => $this->description,
]);
$this->reset();
}
public function render()
{
return view('livewire.elements.todolist.todolist',[
'todos' => todo::orderBy('is_done','ASC')->orderBy('created_at','DESC')->get(),
]);
}
}
TodoPolicy
namespace App\Policies;
use App\Models\User;
use App\Models\todo;
use Illuminate\Auth\Access\Response;
class todoPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, todo $todo): bool
{
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return true;
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, todo $todo): bool
{
//
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, todo $todo): bool
{
//
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, todo $todo): bool
{
//
}
/**
* Determine whether the user can permanently delete the model.
*/
public function forceDelete(User $user, todo $todo): bool
{
//
}
}
Я пробовал регистрировать политики вручную, но это ничего не изменило.
@ceejayoz Я внес изменения, но все равно не работает






Проблема заключалась в том, что когда мы хотим return true; использовать функцию политики без передачи ей моделей, нам следует сделать модель необязательной, например:
public function create(?User $user): bool
{
return true;
}
Это так важно, особенно когда вы не используете систему аутентификации Laravel.
Мне потребовалось некоторое время, чтобы найти его, но, покопавшись в пакете laravel, я обнаружил, что политики должны находиться внутри папки моделей.
Таким образом, пространство имен для вашего класса политики должно быть
namespace App\Models\Policies;
Вы можете сделать и то, и другое: сначала Laravel ищет политики внутри App\Models\Policies, затем ищет внутри App\Policies
попробуй это. в laravel 11 удалили AuthServiceProvider. Поэтому вам придется сделать это в AppServiceProvide, чтобы зарегистрировать его вручную.
https://laravel.com/docs/11.x/authorization#manually-registering-policies
Я не хотел использовать аутентификацию Laravel, это тоже 11
Я подозреваю, что ваша проблема в капитализации. Модель по имени
todoбудет искатьtodoPolicy; вам следует использовать соглашения об именах Laravel как для файлов, так и для классов (App\Models\Todoиapp/Models/Todo.php), особенно если вы будете размещать хостинг в Linux (как это делает большинство людей).