Laravel Policy

Odpowiedz Nowy wątek
2019-07-10 22:45
0

Używam route model binding i policy w Laravel i w jednym przypadku mi to działa natomiast w drugim już nie

//CommentPolicy
 public function delete(User $user, Comment $comment)
    {
        return $user->id === $comment->user_id;
    }
//CommentController
public function destroy(Comment $comment)
    {
        $this->authorize('delete', $comment);
        $comment->delete();
    }
//AuthServiceProvider
 protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
        Article::class => ArticlePolicy::class,
        Comment::class => CommentPolicy::class
    ];

w przypadku artykułów wszystko działa poprawnie natomiast w przypadku komentarzy. Jeśli mój kontroler wygląda w sposób jak powyżej (z autoryzacja) otrzymują informację

This action is unauthorized.

kiedy usunę linijkę odpowiedzialną za autoryzację kod się wykonuje jednak z bazy rekord nie zostaje usunięty.

Pozostało 580 znaków

2019-07-10 23:27
0

Po pierwsze metody powinny się nazywać tak samo. W jednym masz delete w drugim destroy, w obu musi być to samo, by kod się wykonał. Taka sama nazwa i parametry.

edytowany 1x, ostatnio: mr_jaro, 2019-07-10 23:28

Pozostało 580 znaków

2019-07-10 23:38
0

Zmieniłem na

//CommentController
public function destroy(Comment $comment)
    {
        $this->authorize('destroy', $comment);
        $comment->delete();
    }
//CommentPolicy
public function destroy(User $user, Comment $comment)
    {
        return $user->id === $comment->user_id;
    }

i dalej otrzymuję

"This action is unauthorized."

Pozostało 580 znaków

2019-07-10 23:41
0

dalej... po co wywołujesz $this->authorize ? Prawidłowo zrobione policy wykonuje się samo automatycznie.

skorzystałem z tutoriala, jak rozumiem tą linię kodu mogę całkiem ominąć? - michalos25 2019-07-10 23:43
@michalos25: tak, wystarczy spięcie w service providerze - mr_jaro 2019-07-10 23:44

Pozostało 580 znaków

2019-07-10 23:45
0

ok, to już teraz działa, kod się wykonuje prawidłowo jednak rekord nie zostaje usunięty z bazy

Pozostało 580 znaków

2019-07-10 23:49
0

Odpal debuggera i sprawdź czy rzeczywiście ten rekord przychodzi ci tam, poza tym czy czasem nie masz włączonego soft delete?

Pozostało 580 znaków

2019-07-11 00:11
0

uruchomiłem debugger i coś mi tu nie pasuje

{
                    "connection": "mysql",
                    "query": "delete from `replies` where `replies`.`comment_id` is null and `replies`.`comment_id` is not null;",
                    "time": 0.34
                }

próbuję usunąć rekord z tabeli replies gdzie powinien usuwać z tabeli comments

Pozostało 580 znaków

2019-07-11 22:59
0

też jeśli zrobię to w ten sposób

Comment::where('id', 1)->delete();

wszystko działa poprawnie

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0