Nasza strona używa cookies. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Niestandardowe reguły walidacji Laravela

Sergey Elizov Freelance Software Engineer / Upwork
Sprawdź, jak stworzyć swoją własną regułę walidacji Laravela, którą możesz wykorzystać do pracy przy plikach wideo.
Niestandardowe reguły walidacji Laravela

Laravel ma ogromny zestaw wbudowanych reguł walidacji, które są wystarczające dla większości projektów, ale nie zawsze jest tak łatwo. Na szczęście Laravel pozwala stworzyć niestandardowe reguły. W tym artykule pokażę, jak utworzyć regułę dla walidacji filmów. Reguła ta sprawdzi maksymalny dozwolony bitrate pliku wideo.


Ustawianie zależności

Aby rozpocząć, musimy zainstalować narzędzie do przetwarzania filmów. FFMpeg to zestaw bezpłatnych narzędzi typu open source. Ja pracuję na Ubuntu, ale FFMpeg można zainstalować na innych systemach operacyjnych, w tym MacOS i Windows.

$ sudo apt update && sudo apt install ffmpeg

Zainstalujmy teraz ten pakiet, aby móc swobodnie pracować w FFMpeg z PHP.

$ composer require php-ffmpeg/php-ffmpeg


Tworzenie reguły

Wygenerujemy teraz regułę przez artisan.

$ php artisan make:rule MaxVideoBitRate


Polecenie to utworzy pustą klasę dla reguły w przestrzeni nazw App\Rules. Wypełnijmy więc tę klasę logiką. Konstruktor zaakceptuje maksymalną wartość bitrate, której nie można przekroczyć. Przekazana metoda zawiera logikę weryfikacji. Musimy teraz otworzyć plik, przeczytać informacje o filmie i sprawdzić szybkość transmisji. Metoda message zawiera tekst, który zostanie zwrócony, jeśli bitrate jest większy niż dozwolona wartość.

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use FFMpeg\FFMpeg;

class MaxVideoBitRate implements Rule
{
    protected $maxBitRate;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct(int $maxBitRate)
    {
        $this->maxBitRate = $maxBitRate;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $video = FFMpeg::create()->open($value->getRealPath());

        $videoInfo = $video->getStreams()->videos()->first();

        return $this->maxBitRate >= $videoInfo->get('bit_rate');
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'Exceeded the maximum allowed bitrate value.';
    }
}


Reguła w praktyce

Teraz możemy skorzystać z naszej nowej reguły. Aby to zrobić, utworzymy nowe żądanie.

$ php artisan make:request VideoUploadRequest

Dodajmy naszą regułę i kilka dodatkowych.

<?php

namespace App\Http\Requests;

use App\Rules\MaxVideoBitRate;
use Illuminate\Foundation\Http\FormRequest;

class VideoUploadRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'video' => [
                'bail',
                'mimetypes:video/*',
                new MaxVideoBitRate(12000000),
            ],
        ];
    }
}

Zwróć uwagę na zasadę bail. Jeśli zamiast wideo, prześlesz inny plik, skanowanie zatrzyma się na mimetypes:video i nie pójdzie dalej. Jeśli usuniesz bail, walidacja przejdzie przez wszystkie reguły i dojdzie do nowej. FFMpeg nie będzie w stanie poprawnie przetworzyć takiego pliku. W rezultacie zostanie zgłoszony wyjątek (FFMpeg\Exception\RuntimeException), zatem uważaj.

Podsumowanie

Niestandardowe reguły Laravela pozwalają ukryć złożoną logikę weryfikacji w specjalizowanych klasach, przechowywać je w jednym miejscu i łatwo z nich korzystać. Mam nadzieję, że ten artykuł Ci się przyda. 

Dziękuję za uwagę i powodzenia.


Oryginał tekstu w języku angielskim przeczytasz tutaj

Rozpocznij dyskusję

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 160 tysiącami naszych czytelników

Dowiedz się więcej