Laravel zapewnia wiele doskonałych funkcji pomocniczych , które są wygodne do wykonywania takich czynności, jak praca z tablicami, ścieżkami plików, ciągami i trasami, między innymi takimi jak ukochana dd()
funkcja.
Możesz także zdefiniować własny zestaw funkcji pomocniczych dla aplikacji Laravel i pakietów PHP, używając Composera do ich automatycznego importowania.
Jeśli dopiero zaczynasz przygodę z Laravelem lub PHP, przejdźmy przez to, jak możesz stworzyć własne funkcje pomocnicze, które są automatycznie ładowane przez Laravela.
Tworzenie pliku pomocników w aplikacji
Laravel Pierwszy scenariusz, w którym możesz chcieć uwzględnić funkcje pomocnicze, znajduje się w kontekście aplikacji Laravel. W zależności od preferencji możesz zorganizować lokalizację plików pomocniczych w dowolny sposób, jednak oto kilka sugerowanych lokalizacji:
-
app/helpers.php
-
app/Http/helpers.php
Wolę trzymać moje w app/helpers.php
katalogu głównym przestrzeni nazw aplikacji.
Automatyczne ładowanie
Aby korzystać z funkcji pomocniczych PHP, musisz załadować je do programu w czasie wykonywania. Na początku mojej kariery nierzadko zdarzało się, że na górze pliku
require_once ROOT . '/helpers.php';
znajdował się tego rodzaju kod:Funkcje PHP nie mogą być automatycznie ładowane. Mamy jednak znacznie lepsze rozwiązanie za pośrednictwem Composera niż użycie require
lub require_once
.
Jeśli utworzysz nowy projekt Laravel, zobaczysz klucze i w pliku:
"autoload": {
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
Jeśli chcesz dodać plik pomocniczy, composer ma files
klucz (który jest tablicą ścieżek plików), który możesz zdefiniować wewnątrz autoload
:
"autoload": {
"files": [
"app/helpers.php"
],
"classmap": [
"database/seeds",
"database/factories"
],
"psr-4": {
"App\\": "app/"
}
},
Po dodaniu nowej ścieżki do tablicyfiles
, musisz zrzucić autoloader:composer.json
autoload-dev
autoload
composer dump-autoload
Teraz na każde żądanie plik helpers.php zostanie załadowany automatycznie, ponieważ Laravel wymaga autoloadera Composera w public/index.php
:
require __DIR__.'/../vendor/autoload.php';
Definiowanie funkcji
Definiowanie funkcji w klasie pomocników jest najłatwiejszą częścią, chociaż istnieje kilka zastrzeżeń. Wszystkie pliki pomocnicze Laravela są opakowane w kontrolę, aby uniknąć kolizji definicji funkcji:
if (! function_exists('env')) {
function env($key, $default = null) {
// ...
}
}
Może to być trudne, ponieważ możesz napotkać sytuacje, w których używasz definicji funkcji, której się nie spodziewałeś na podstawie tego, która z nich została zdefiniowana jako pierwsza.
Wolę używać function_exists
testów w moich pomocnikach aplikacji, ale jeśli definiujesz pomocników w kontekście aplikacji, możesz pominąć function_exists
sprawdzanie.
Pomijając sprawdzanie, zobaczysz kolizje za każdym razem, gdy pomocnicy ponownie definiują funkcje, co może być przydatne.
W praktyce kolizje nie zdarzają się tak często, jak mogłoby się wydawać, i należy upewnić się, że definiujesz nazwy funkcji, które nie są zbyt ogólne. Możesz również poprzedzić nazwy funkcji, aby zmniejszyć prawdopodobieństwo kolizji z innymi zależnościami.
Przykład
pomocnika: Podoba mi się pomocnik ścieżki i adresu URL Railsów, który otrzymujesz za darmo podczas definiowania zasobnej trasy. Na przykład trasa zasobu photos
uwidoczniłaby pomocników trasy, takich jak new_photo_path
, edit_photo_path' itp.
Kiedy używam routingu zasobów w Laravel, lubię dodawać kilka funkcji pomocniczych, które ułatwiają definiowanie tras w moich szablonach. W mojej implementacji lubię mieć funkcję pomocniczą adresu URL, którą mogę przekazać model Eloquent i uzyskać trasę zasobów z powrotem przy użyciu konwencji, które definiuję, takich jak:
create_route($model);
edit_route($model);
show_route($model);
destroy_route($model);
Oto jak możesz zdefiniować a show_route
w swoim app/helpers.php
pliku (inne wyglądałyby podobnie):
if (! function_exists('show_route')) {
function show_route($model, $resource = null)
{
$resource = $resource ?? plural_from_model($model);
return route("{$resource}.show", $model);
}
}
if (! function_exists('plural_from_model')) {
function plural_from_model($model)
{
$plural = Str::plural(class_basename($model));
return Str::kebab($plural);
}
}
Funkcja plural_from_model()
jest po prostu kodem wielokrotnego użytku, którego funkcje trasy pomocniczej używają do przewidywania nazwy zasobu trasy na podstawie preferowanej przeze mnie konwencji nazewnictwa, który jest kebabem-przypadkiem liczby mnogiej modelu.
Na przykład poniżej znajduje się przykład nazwy zasobu pochodzącej z modelu:
$model = new App\LineItem;
plural_from_model($model);
// => line-items
plural_from_model(new App\User);
// => users
Korzystając z tej konwencji, należy zdefiniować trasę zasobu w następujący sposób w routes/web.php
:
Route::resource('line-items', 'LineItemsController');
Route::resource('users', 'UsersController');
A następnie w szablonach bloków można wykonać następujące
<a href="{{ show_route($lineItem) }}">
{{ $lineItem->name }}
</a>
czynności:Co spowoduje utworzenie czegoś podobnego do następującego kodu HTML:
<a href="http://localhost/line-items/1">
Line Item #1
</a>
Pakiety
Pakiety Composer mogą również używać pliku pomocników dla dowolnych funkcji pomocniczych, które mają być dostępne dla projektów korzystających z pakietu.
To samo podejście zastosujesz w pliku pakietucomposer.json
, definiując files
klucz z tablicą plików pomocniczych.
Konieczne jest dodanie function_exists()
kontroli wokół funkcji pomocnika, aby projekty korzystające z kodu nie zostały przerwane z powodu kolizji nazewnictwa.
Powinieneś wybrać odpowiednie nazwy funkcji, które są unikalne dla twojego pakietu i rozważ użycie krótkiego prefiksu, jeśli obawiasz się, że nazwa funkcji jest zbyt ogólna.
Dowiedz się więcej
Zapoznaj się z dokumentacją automatycznego ładowania Composera, aby dowiedzieć się więcej o dołączaniu plików i ogólnych informacji na temat automatycznego ładowania klas.