• Czas czytania ~4 min
  • 01.04.2024

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.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297