Mam dany model i moim celem jest by w zależności od uprawnień użytkownika zwracać określone pole lub pozwalać na modyfikacje tylko określonych pól.
Może ktoś wyjaśnić jak to zrobić dobrze nie chodzi mi o sam kod ale o idee. Gdzie i jak i co wykorzystać.
Przykład:
Użytkownik może zmienić dane adresowe (miasto itd) ale nie może zmienić np. statusu swojego konta.
Przy pobieraniu danych, użytkownik i admin ma pełne dane konta, ale nie zalogowany użytkownik widzi tylko część danych.
Korzystam z https://github.com/dingo/api
Zależy jak bardzo rozbudowany ma być ten system uprawnień, możesz skorzystać z paczki.
Jeżeli chodzi o idee to ja bym dodał typ użytkownika do migracji users'ów i w modelu w atrybutach (https://laravel.com/docs/5.8/eloquent-mutators) sprawdzał z kim mam do czynienia przed zwróceniem pól - wszystko zależy od tego co dokładnie musisz rozwiązać.
Co do przykładu to można dodać middleware (https://laravel.com/docs/5.8/middleware) do grupy routsów i w zależności od typu usera kierować do odpowiedniego panelu - admina, użytkownika etc.
Czyli co dla każdego rodzaju zapytania mam tworzyć oddzielnny controller inny endpoint?
gdzie zwracam tylko te dane jakie o użytkowniku może widziec inny user
$api->get('/', 'App\Http\Controllers\UserController@index');
gdzie zwracam tylko te dane jakie o użytkowniku moze widziec admin
$api->get('/', 'App\Http\Controllers\UserAdminController@index');
Tak dokładnie po to są controllery, żeby kontrolować
Jeżeli chodzi o strukturę to bym zrobił to tak:
Http
--Controllers
----Panel
------Admin
--------ProfileController
------User
--------ProfileController
w routsach zrób sobie grupę i dodaj w niej middleware w którym sprawdzasz typ usera i kierujesz do \Admin lub \User ProfileController'a przemyśl sobie to jakoś czytelnie wrzuć w foreach'a, żeby nie pisać 10 razy prawie tego samego endpoint'a.
EDIT:
teraz tak się wczytałem mocniej i z tego co rozumiem to nie jest panel, tylko typowo frontowe dane? W takim razie zasada ta sama, tylko struktura dopasowana inaczej
Co do paczki API to nigdy z niego nie korzystałem, Laravel oferuje własne rozwiązania REST API i resources do modelowania danych.
Klasy reprezentujących model możesz mieć wiele i dla każdego odpowiednie fillable. Poczytaj jeszcze o gate. Spatie permission domyślnie też ogranicza w ten sposób dostęp do modelu.
@viking
Gates i policies są mega, nie czytałem o nich wcześniej, dzięki.
Natomiast co do "Klasy reprezentujących model możesz mieć wiele i dla każdego odpowiednie fillable", proponujesz tworzyć dodatkowe klasy rozszerzające model dla każdego typu usera, po to, żeby dodać fillable?
Dostęp do edycji/dodawania już napisałem jak rozwiązujemy - walidacją/filtracją, a to aby get'em otrzymać odchudzony obiekt możemy wykorzystać API Resource.
Oczywiście możliwe, że już ktoś wpadł na to aby ubrać to w jakąś libkę, która by to robiła za pomocą jednej "konfiguracji".
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)