Laravel autoryzacja użytkownika i danych użytkownika przy użyciu Gate

Aby inny użytkownik nie mógł wyświetlać oraz edytować danych innego użytkownika musimy zastosować autoryzację na poziomie kontrolera.

Jeśli chodzi o wyświetlanie danych możemy to zrobić za pomocą where i podać ID użytkownika zalogowanego przy edycji danych oraz usuwaniu byśmy musieli najpierw sprawdzać czy dany wpis należy do zalogowanego użytkownika i tutaj z pomocą przychodzi Fasada Gate.

Jak użyć Fasady Gate ?

Musimy ją zdefiniować w pliku AuthServiceProvider.php.

  1. Dodajemy Modele z których chcemy autoryzować dane w moim przypadku było to User i Site.
  2. Następnie definiujemy Gate. Łączymy dwie tabele ze sobą kluczem w tym przypadku było to id użytkownika.

Następnie używamy go w kontrolerze. Musimy dodać fasadę do kontrolera

use Illuminate\Support\Facades\Gate;

Następnie w danej metodzie przekładowo metoda show.

public function show($id)
    {
        $site = Site::findOrFail($id);

        if (!Gate::allows('menage-site', $site)) {
            return response([
                'errors' => [
                    'status' => 'Forbidden',
                    'code' => 403,
                    'message' => 'You do not have access to this resource'
                ]
            ], 403);
        }
        return $site;
    }

tutaj jest zastosowane w API użytkownik otrzyma kod 403 jeśli spróbuję wyświetlić dane nie swojej strony. Równie dobrze możemy zrobić to tak:

public function show($id)
    {
        $site = Site::findOrFail($id);

        if (!Gate::allows('menage-site', $site)) {
            abort(403);
        }
        return $site;
    }
Taki widok otrzyma użytkownik który nie ma uprawnień do danego zasobu.

Laravel flash message – własne komunikaty o błędach

Aby wykonać własne komunikaty o błędach należy wykonać kilka kroków.

  1. Tworzymy plik message.blade.php w katalogu partials (jeśli nie mamy takiego katalogu tworzymy go)
@if (session('status'))
    <div class="alert alert-success alert-dismissible fade show" role="alert">
        {!! session('status') !!}
        <button type="button" class="close" data-dismiss="alert" aria-label="Close">
            <span aria-hidden="true">×</span>
        </button>
    </div>
@endif

2. W kontrolerze musimy dodać wpis

return back()->withStatus(__('Site successfully add <a href="' . route('site.show', $site->id)  . '">Go to site</a>'));

withStatus status będzie nazwą sesji którą musimy przechwycić w widoku co widzimy w pierwszym kroku.

Następnie w widoku gdzie chcemy wyświetlić komunikat includujemy plik z naszego widoku wiadomości

@include('partials.message')

W tym miejscu po wysłaniu formularza zostanie wyświetlona wiadomość.

Jeśli chcesz wyświetlić błędy to możesz to zrobić wyświetlając zmienna $errors jest to tablica więc należy ją potraktować foreachem (na początku sprawdzamy czy w zmiennej error są jakieś wpisy)

@if ($errors->count())
    @foreach ($errors->all() as $error)
        <div class="alert alert-danger alert-dismissible fade show" role="alert">
            {{ $error }}
        </div>
    @endforeach
@endif

Laravel 8 walidacja danych z formularza

Laravel ma dobrze zaprojektowany system walidacji przesłanych danych.

Aby wykonać walidację wystarczy kawałek kodu przykład poniżej:

$data = $request->validate([
         'url' => ['required', 'unique:sites,url,' . $request->url . ',id,user_id,' .  $request->user()->id, 'max:255', 'min:2', 'url'],
         'name' => ['required', 'max:255', 'min:2']
]);

Krótki opis:
Pole url sprawdza czy jest uzupełnione oraz musi być unikalne w tabeli site dla pola URL oraz unikalne dla danego użytkownika. Czyli w bazie mogą być dwa takie same adresu URL ale każdy należy do innego użytkownika. Adres może mieć maksymalnie 255 znaków oraz minimalnie 2 znaki.

Pole name: wymagane, maksymalnie 255 znaków i minimalnie 255 znaków.

Jeśli chcemy coś „dokleić” do wysłanego formularza na przykład status (wiadomo można zdefiniować to w bazie danych jako domyślna wartość), lecz jeśli chcemy dodać na przykład ID zalogowanego użytkownika.

$data['user_id'] = $request->user()->id;

Następnie zapisujemy nowy rekord w bazie

$site = Site::create($data);

Nie potrzebujemy żadnych ifów ponieważ laravel sam dba o to czy walidacja przebiegła pomyślnie i jeśli nie zostanie wszystko spełnione otrzymamy stosowny komunikat.

Jeśli chcemy dodać własne komunikaty błędów oczywiście możemy zrobić to przez flash message w laravelu.

Ukrycie miniatury produktu PrestaShop 1.7

Jak ukryć miniaturę produktu jeśli mamy tylko jedno zdjęcie dla danego produktu? Wystarczy zrobić instrukcję warunkową i sprawdzić czy jest więcej niż jedno zdjęcie danego produktu.

W moim szablonie wyświetlanie miniatur znajduje się w pliku product-cover-thumbnails.tpl

Szukamy wiersza {foreach from=$product.images item=image} i dodajemy nad nim przed tym {if $product.images|@count > 1}. Dodane wiersze oznaczone strzałkami na zrzucie ekranu poniżej.