Laravel - Useful Functions that not Everyone Knows

Laravel - przydatne funkcje, o których nie każdy wie

Laravel jest frameworkiem bardzo rozbudowanym, dającym użytkownikowi wiele narzędzi i możliwości do pracy nad projektem. Postanowiłem przedstawić Wam dzisiaj kilka mniej znanych, ale za to bardzo przydatnych możliwości udostępnionych nam przez twórców. Mam nadzieję, że wpłyną one pozytywnie na intuicyjność i szybkość pisania kodu.

1. Metody Scheduler mogą być chainowane w większej ilości

Wykonywanie zadań cyklicznych jest czymś esencjonalnym w przypadku większości projektów aplikacji webowych. Laravel wychodzi naprzeciw tego zapotrzebowania w postaci swojego "Task Schedulingu". Rozwiązanie to wykonane jest w bardzo rozbudowany, ale i zarazem przyjazny sposób. 

    // Co godzinę, w dni robocze, pomiędzy 8:00 a 17:00...
    $schedule->command('foo')
      ->weekdays()
      ->hourly()
      ->between('8:00', '17:00');

Wszystkie logicznie poprawne chainy tego typu będą tutaj działać prawidłowo. Jest to bardzo eleganckie i wyjątkowo wygodne rozwiązanie.

Możliwe jest również stworzenie bardziej złożonego zadania w innej klasie i przekazanie go do naszego polecenia.

    // Co godzinę, w dni robocze, pomiędzy 8:00 a 17:00, jeżeli metoda shouldSkip() zwróci true...
    $schedule->command('foo')
      ->weekdays()
      ->hourly()
      ->between('8:00', '17:00')
      ->skip(function () {
          return app('SkipValidator')->shouldSkip();
      });

Tego typu uproszczenia są kluczową częścią idei stojącej za tym frameworkiem. Więcej o jego unikalności możecie przeczytać w naszym artykule porównującym frameworki Laravel i Symfony - główne różnice.

2. Eloquent - metoda find() przyjmuje wiele parametrów

Metoda find() może być wykorzystana do pobrania większej ilości rekordów. Aby to osiągnąć, wystarczy jako argument przekazać tablicę. Metoda zwróci w takim przypadku kolekcje modeli Eloquent z podanymi id (oczywiście jeżeli takowe istnieją). Choć może to wydawać się proste i oczywiste, często spotykam się z kodem, w którym ktoś ewidentnie o tym zapomniał.

// Znajdź użytkownika o id równym 1.
$data = UserModel::find(1)

// Znajdź użytkowników z id równymi 1, 2, 3, 4, 5.
$data = UserModel::find([1,2,3,4,5])

3. Query builder na kilku kolumnach w łatwy sposób

Weźmy tutaj przykładowe zapytanie SQL

SELECT 
  * 
from 
  `users` 
WHERE 
  `name` = 'developer' 
  AND `email` = '[email protected]' 
LIMIT 
  1

Przy użyciu Eloquent zapytanie możemy uprościć i przedstawić w takiej formie:

\App\User::whereNameAndEmail('developer','[email protected]')->first();

// Powyższy przykład jest uproszczoną wersją zapisów poniżej.
\App\User::where('name', 'developer')->where('email', '[email protected]')->first();
\App\User::where(['name' => 'developer', 'email' => '[email protected]'])->first();

Rozwiązanie działa zarówno z operatorem "and" jak i "or". 

\App\User::whereNameOrEmail('developer','[email protected]')->first();

Po raz kolejny uwypukla się tutaj intuicyjność i "prostota" kodu pisanego w Laravel.

4. Załączanie plików do wiadomości email

Niezależnie od narzędzia z jakiego korzystamy, wysyłanie wiadomości e-mail wraz załącznikami i zdjęciami często okazuje się zadaniem bardziej złożonym i skomplikowanym, niż być powinno. Laravel w tym temacie trzyma się zdecydowanie reguły KISS.

Załóżmy, że do naszej wiadomości chcemy dołączyć plik "tajny_dokument_1.pdf", znajdujący się pod ścieżką "/tajne_dokumenty/tajny_dokument_1.pdf". 

Mail::send('emails.secret', [], function ($mail) {
    $mail->to('[email protected]');
    $mail->subject('Tajne dokumenty o które prosiłeś');
    $mail->attach(public_path('tajne_dokumenty/tajny_dokument_1.pdf'));
});

Podobnie się sprawy mają z dodawaniem zdjęć w treści maila.

Zdjęcie o które prosiłeś:

<img src="{{ $message->embed(public_path('img/zdjecie.jpg')) }}">

Dzięki!

5. Oryginalne wartości atrybutu

Po wprowadzeniu zmian do rekordu Eloquent jesteśmy w stanie sprawdzić jego oryginalną wartość.

$user = App\User::first();

// Oryginalna wartość pola mail -> [email protected]
$user->mail;

// Ustawiamy nową wartość dla tego pola.
$user->mail = '[email protected]';

// Pole to zwracać będzie teraz jego nową wartość -> [email protected]
$user->mail;

// Korzystając z metody getOriginal() jesteśmy w stanie dostać się do wartości oryginalnej.
// W tym przypadku zwróci wartość -> [email protected]
$user->getOriginal('mail');    

// Jesteśmy również w stanie pobrać cały oryginalny obiekt.
$user->getOriginal();

6. Sprawdzanie czy model uległ zmianie

Podobnie jak w przypadku punktu poprzedniego, jesteśmy w stanie stwierdzić, czy w naszym obiekcie zaszły zmiany. Przygotowana została do tego celu przez twórców Laravel specjalna metoda isDirty(). Rozbudujmy nasz wcześniejszy przykład o jej implementację.

$user = App\User::first();

// Oryginalna wartość pola mail -> [email protected]
$user->mail;

// Metoda zwróci 'false' gdyż pracujemy na świeżo pozyskanym obiekcie z bazy.
$user->isDirty();  

// Ustawiamy nową wartość dla tego pola.
$user->mail = '[email protected]';

// Metoda zwróci 'true' gdyż przed chwilą zmieniliśmy wartość dla pola mail
$user->isDirty();  

// Możemy pójść o krok dalej i sprawdzać zmiany dla poszczególnych pól.

// Zwróci 'true'.
$user->isDirty('mail');   
// Zwróci 'false'.
$user->isDirty('name');

// Pole to zwracać będzie teraz jego nową wartość -> [email protected]
$user->mail;

// Korzystając z metody getOriginal() jesteśmy w stanie dostać się do wartości oryginalnej.
// W tym przypadku zwróci wartość -> [email protected]
$user->getOriginal('mail');    

// Jesteśmy również w stanie pobrać cały oryginalny obiekt.
$user->getOriginal();

Podsumowanie

Laravel jest frameworkiem bardzo rozbudowanym, dającym developerom dużo swobody i możliwości. Zapewnia on również wiele funkcjonalności, o których istnieniu nie każdy musi wiedzieć. Przedstawione przeze mnie funkcje stanowią jedynie ułamek wszystkich możliwości, jakie oferuje nam system i z których korzystamy na co dzień w naszej agencji PHP development

3. Najlepsze praktyki zespołów programistycznych