Chciałbym utworzyć funkcje pomocnicze, aby uniknąć powtarzania kodu między widokami w Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Są to w zasadzie funkcje formatowania tekstu. Gdzie i jak mogę utworzyć plik z tymi funkcjami?
php
laravel
laravel-5
laravel-helper
Calebe Oliveira
źródło
źródło
Klasy niestandardowe w Laravel 5, prosty sposób
Ta odpowiedź dotyczy ogólnych klas niestandardowych w Laravel. Aby uzyskać odpowiedź bardziej specyficzną dla ostrzy, zobacz Niestandardowe dyrektywy dotyczące ostrzy w Laravel 5 .
Krok 1: Utwórz plik Helpers (lub inną klasę niestandardową) i nadaj mu pasującą przestrzeń nazw. Napisz swoją klasę i metodę:
Krok 2: Utwórz alias:
Krok 3: Uruchom
composer dump-autoload
w katalogu głównym projektuKrok 4: Użyj go w szablonie Blade:
Dodatkowy kredyt: użyj tej klasy w dowolnym miejscu w aplikacji Laravel:
Źródło: http://www.php-fig.org/psr/psr-4/
Dlaczego to działa: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
Skąd pochodzi automatyczne ładowanie: http://php.net/manual/en/language.oop5.autoload.php
źródło
aliases
tablicą wapp/config.php
:'Helper' => App\Helpers\Helper::class,
Wtedy będziesz w stanie dobrze zadzwonić do blokuHelper::prettyJson();
.moją pierwszą myślą było również automatyczne ładowanie kompozytora, ale nie wydawało mi się to bardzo Laravel 5ish. L5 intensywnie korzysta z usług dostawców, są one tym, co uruchamia twoją aplikację.
Na początek stworzyłem folder w moim
app
katalogu o nazwieHelpers
. Następnie wHelpers
folderze dodałem pliki funkcji, które chciałem dodać. Posiadanie folderu z wieloma plikami pozwala nam uniknąć jednego dużego pliku, który staje się zbyt długi i niemożliwy do zarządzania.Następnie utworzyłem a
HelperServiceProvider.php
, uruchamiając polecenie rzemieślnika:W ramach
register
metody dodałem ten fragment koduna koniec zarejestruj dostawcę usług w swojej
config/app.php
tablicy dostawcówteraz dowolny plik w
Helpers
katalogu jest ładowany i gotowy do użycia.AKTUALIZACJA 22.02.2016
Jest tu wiele dobrych opcji, ale jeśli moja odpowiedź będzie dla ciebie odpowiednia, poszedłem naprzód i przygotowałem pakiet obejmujący pomocników w ten sposób. Możesz użyć tego pakietu jako inspiracji lub pobrać go również w programie Composer. Ma wbudowane pomocniki, z których często korzystam (ale domyślnie wszystkie są nieaktywne) i pozwala tworzyć własne niestandardowe pomocniki za pomocą prostego generatora rzemieślnika. Odpowiada także na sugestię jednego z respondentów dotyczącą korzystania z programu mapującego i pozwala jawnie zdefiniować niestandardowe pomocniki do załadowania lub domyślnie automatycznie załadować wszystkie pliki PHP w katalogu pomocnika. Opinie i PR są mile widziane!
Github: browner12 / helpers
źródło
start.php
pliku (co nie było świetne, ale spełniło swój cel jak na razie). masz inną sugestię dotyczącą ładowania wielu plików?To, co jest sugerowane przez
JeffreyWay
tą Laracasts dyskusja .app/Http
katalogu utwórzhelpers.php
plik i dodaj swoje funkcje.composer.json
wautoload
bloku dodaj"files": ["app/Http/helpers.php"]
.composer dump-autoload
.źródło
app/helpers.php
lubapp/Helpers/
wydaje się być lepszym miejscem.composer dump-autoload
?composer dump-autoload
, możesz postępować zgodnie z poniższym: opracowano.be/2014/08/29/composer-dump-autoload-laravelPo przejrzeniu różnych odpowiedzi w SO i Google nadal nie mogłem znaleźć optymalnego podejścia. Większość odpowiedzi sugeruje, że zostawiamy aplikację i polegamy na zewnętrznym narzędziu Composer, aby wykonać zadanie, ale nie jestem przekonany, czy połączenie z narzędziem, aby tylko dołączyć plik, jest mądre.
Odpowiedź Andrew Browna była najbliższa temu, jak myślę, że należy do niej podejść, ale (przynajmniej w 5.1) krok dostawcy usług jest zbędny. Odpowiedź Heisiana podkreśla, którego użycie
PSR-4
przybliża nas o krok. Oto moje końcowe wdrożenie dla pomocników w widokach:Najpierw utwórz plik pomocnika w dowolnym miejscu w katalogu aplikacji z przestrzenią nazw:
Następnie alias swojej klasie
config\app.php
, waliases
tablicy:I to powinno być wszystko, co musisz zrobić.
PSR-4
i alias powinien wystawiać pomocnika na twoje widoki, więc w twoim widoku, jeśli wpiszesz:Powinien generować:
źródło
{!! bob() !!}
. zamierzam jeszcze trochę poszukać i sprawdzić, czy to możliwebob()
prawdziwie globalnym nie byłaby mądra. Przestrzenie nazw istnieją z jakiegoś powodu i nie powinniśmy dzwonićbob()
obok podstawowych funkcji PHP. Dodam twój bit aliasingu do mojego kodu - dzięki!extends Helper
jest Nie wydaje mi się to konieczne.extends Helper
rzeczywiście nie jest to konieczne. Dzięki za heads-upy.Niestandardowe dyrektywy dotyczące ostrzy w Laravel 5
Tak, jest na to inny sposób!
Krok 1: Zarejestruj niestandardową dyrektywę Blade:
Krok 2: Użyj niestandardowej dyrektywy Blade:
Wyjścia:
TO JEST MOJA NIESTANDARDOWA DYREKTYWA OSTRZA !!
Link niestandardowy
Źródło: https://laravel.com/docs/5.1/blade#extending-blade
Dodatkowa lektura: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
Jeśli chcesz dowiedzieć się, jak najlepiej tworzyć niestandardowe klasy, których możesz używać w dowolnym miejscu , zobacz Niestandardowe klasy w Laravel 5, Prosty sposób
źródło
To jest mój plik HelpersProvider.php:
Powinieneś utworzyć folder o nazwie
Helpers
podapp
folderem, a następnie utworzyć plik o nazwiewhatever.php
inside i dodać ciąg znakówwhatever
wewnątrz tablicy $ helpers.Gotowy!
Edytować
Nie używam już tej opcji, obecnie używam kompozytora do ładowania plików statycznych, takich jak pomocniki.
Możesz dodać pomocników bezpośrednio na:
źródło
glob()
jak napisał Andrew Brown? Jeśli chcesz mieć możliwość określenia plików, które chcesz dołączyć, dlaczego nie określić plików wcomposer.json
celu ich automatycznego załadowania, jak napisał Joseph Silber? Dlaczego wolisz to rozwiązanie? Nie twierdzę, że to złe rozwiązanie, jestem po prostu ciekawy.composer.json
wyjątkiem dwóch punktów - po pierwsze, utrzymuje mapę w samej aplikacji, a nie w pliku metadanych; po drugie, nie wymaga ponownego uruchamiania przycomposer dump-autoload
każdej zmianie listy plików do załadowania.include
lubrequire
, laravel ma już wbudowaną PSR-4 autoloading: php-fig.org/psr/psr-4Dla niestandardowych bibliotek pomocniczych w moim projekcie Laravel utworzyłem folder o nazwie
Libraries
w moimLaravel/App
katalogu i w katalogu bibliotek, utworzyłem różne pliki dla różnych bibliotek pomocniczych.Po utworzeniu plików pomocniczych po prostu dołączam wszystkie te pliki do mojego pliku composer.json w ten sposób
i wykonać
źródło
composer dump-autoload
acomposer dumpautoload
także działa infactcomposer du
będzie również działać ...Ponieważ OP poprosił o najlepsze praktyki , myślę, że wciąż brakuje nam tutaj dobrych rad.
Pojedynczy plik helpers.php nie jest dobrą praktyką. Po pierwsze dlatego, że łączysz wiele różnych rodzajów funkcji, więc jesteś przeciwny dobrym zasadom kodowania. Co więcej, może to zaszkodzić nie tylko dokumentacji kodu, ale także metryk kodu, takich jak złożoność cykliczna , wskaźnik konserwacji i objętość Halsteada . Im więcej masz funkcji, tym bardziej się pogarsza.
Dokumentacja kodu byłoby ok za pomocą narzędzi takich jak phpDocumentor , ale przy użyciu Sami go nie odda plików proceduralnych . Tak wygląda dokumentacja interfejsu Laravel API - nie ma dokumentacji funkcji pomocniczych: https://laravel.com/api/5.4
Metryki kodu można analizować za pomocą narzędzi takich jak PhpMetrics . Użycie PhpMetrics w wersji 1.x do analizy kodu frameworku Laravel 5.4 da bardzo złe dane CC / MI / HV zarówno dla plików src / Illuminate / Foundation / helpers.php, jak i src / Illuminate / Support / helpers.php .
Wiele kontekstowych plików pomocniczych (np. String_helpers.php , array_helpers.php itp.) Z pewnością poprawiłoby te złe parametry, co ułatwiłoby utrzymanie kodu. W zależności od zastosowanego generatora dokumentacji kodu byłoby to wystarczająco dobre.
Można go jeszcze ulepszyć, stosując klasy pomocnicze przy użyciu metod statycznych, aby można je było kontekstualizować przy użyciu przestrzeni nazw. Tak jak już Laravel robi z
Illuminate\Support\Str
iIlluminate\Support\Arr
klas. Poprawia to zarówno wskaźniki / organizację kodu, jak i dokumentację. Aliasy klas mogą być użyte, aby były łatwiejsze w użyciu.Strukturyzacja za pomocą klas poprawia organizację kodu i dokumentację, ale z drugiej strony tracimy te świetne krótkie i łatwe do zapamiętania funkcje globalne. Możemy dalej ulepszyć to podejście, tworząc aliasy funkcji do metod klas statycznych. Można to zrobić ręcznie lub dynamicznie.
Laravel wewnętrznie stosuje pierwsze podejście, deklarując funkcje w proceduralnych plikach pomocniczych, które są odwzorowane na metody klas statycznych. To może nie być idealna rzecz, ponieważ musisz ponownie sformułować wszystkie rzeczy (docblocks / arguments).
Osobiście używam dynamicznego podejścia z
HelperServiceProvider
klasą, która tworzy te funkcje w czasie wykonywania:Można powiedzieć, że to już koniec inżynierii, ale nie sądzę. Działa całkiem dobrze i wbrew oczekiwaniom nie kosztuje odpowiedniego czasu wykonania przynajmniej przy użyciu PHP 7.x.
źródło
Oto skrypt powłoki bash, który stworzyłem, aby bardzo szybko wykonać fasady Laravel 5.
Uruchom to w swoim katalogu instalacyjnym Laravel 5.
Nazwij to tak:
Przykład:
Jeśli uruchomisz ten przykład, utworzy on katalogi
Facades
iProviders
pod „your_laravel_installation_dir / app / MojaApl”.Stworzy następujące 3 pliki i wyświetli je również na ekranie:
Po zakończeniu wyświetli komunikat podobny do następującego:
Zaktualizuj więc listę dostawców i aliasów w „config / app.php”
Biegać
composer -o dumpautoload
„./App/MyApp/Facades/Helper.php” będzie początkowo wyglądać następująco:
Teraz po prostu dodaj swoje metody w „./app/MyApp/Facades/Helper.php”.
Oto jak wygląda „./app/MyApp/Facades/Helper.php” po dodaniu funkcji Pomocnika.
Ta funkcja oczekuje wzorca i może zaakceptować opcjonalny drugi argument boolowski.
Jeśli bieżący adres URL pasuje do przekazanego mu wzorca, wyświetli „aktywny” (lub „class =„ active ””, jeśli dodasz „true” jako drugi argument do wywołania funkcji).
Używam go, aby podświetlić aktywne menu.
Poniżej znajduje się kod źródłowy mojego skryptu. Mam nadzieję, że uznasz to za przydatne i daj mi znać, jeśli masz z tym jakieś problemy.
źródło
zamiast dołączać niestandardową klasę pomocnika, możesz dodać do
config/app.php
pliku aliasy.powinno wyglądać tak.
a następnie do kontrolera dołącz pomocnika za pomocą metody „użyj pomocnika”, abyś mógł po prostu wywołać niektóre metody z klasy pomocnika.
lub w widoku zasobów możesz już bezpośrednio wywołać klasę Pomocnika.
Ale nadal jest to podejście programistyczne, które należy stosować. Możemy mieć inny sposób rozwiązywania problemów i chcę po prostu podzielić się tym, co mam dla początkujących.
źródło
Utwórz niestandardowy katalog pomocników: Najpierw utwórz katalog Pomocników w katalogu aplikacji. Utwórz definicję klasy hlper: Utwórzmy teraz prostą funkcję pomocniczą, która połączy dwa łańcuchy. Utwórz nowy plik MyFuncs.php w /app/Helpers/MyFuncs.php Dodaj następujący kod
przestrzeń nazw App \ Helpers; definiuje przestrzeń nazw Pomocników w obszarze Przestrzeń nazw aplikacji. klasa MyFuncs {…} definiuje klasę pomocniczą MyFuncs. publiczna funkcja statyczna pełna_nazwa ($ imię, $ ostatnia nazwa) {…} definiuje funkcję statyczną, która akceptuje dwa parametry ciągu i zwraca ciąg skonkatenowany
Usługa pomocników zapewnia zajęcia
Usługodawcy są przyzwyczajeni do automatycznego ładowania klas. Będziemy musieli zdefiniować dostawcę usług, który załaduje wszystkie nasze klasy pomocnicze do katalogu / app / Helpers.
Uruchom następujące polecenie rzemieślnika:
php artisan make: dostawca HelperServiceProvider
Plik zostanie utworzony w
/app/Providers/HelperServiceProvider.php
Dodaj następujący kod:
TUTAJ,
Teraz musimy zarejestrować HelperServiceProvider i utworzyć alias dla naszych pomocników.
Otwórz
/config/app.php
plikZnajdź zmienną tablicową dostawcy
Dodaj następujący wiersz
Znajdź zmienną tablicową aliasów
Dodaj następujący wiersz
Zapisz zmiany za pomocą naszego niestandardowego pomocnika
Stworzymy trasę, która wywoła naszą niestandardową funkcję pomocniczą Open /app/routes.php
Dodaj następującą definicję trasy
TUTAJ,
źródło
Najpierw utwórz helpers.php w katalogu App \ Http. Następnie dodaj następujący kod do pliku composer.json
Następnie uruchom następujące polecenie
Teraz możesz zdefiniować swoją niestandardową funkcję w pliku helpers.php.
źródło
Innym sposobem, którego użyłem było: 1) utworzenie pliku w aplikacji \ FolderName \ fileName.php i umieszczenie w nim tego kodu, tj.
2) Następnie w naszym ostrzu
Otóż to. i to działa
źródło
Najlepszą praktyką jest pisanie niestandardowych pomocników
1) W
app
katalogu głównym projektu utwórz folder o nazwie Pomocnicy (aby oddzielić i ustrukturyzować kod).2) W folderze napisz pliki psr-4 lub normalne pliki php
Jeśli pliki PHP mają format psr-4, zostaną one automatycznie załadowane, w przeciwnym razie dodaj następujący wiersz w pliku composer.json, który znajduje się w katalogu głównym projektu
Wewnątrz
autoload
klucza utwórz nowy klucz o nazwiefiles
ładującej pliki podczas automatycznego ładowania. Wewnątrzfiles
obiektu dodaj ścieżkę zaczynając od katalogu aplikacji. Oto przykład.PS: spróbuj uruchomić,
composer dump-autoload
jeśli plik nie został załadowany.źródło
Utwórz Helpers.php w app / Helper / Helpers.php
Dodaj kompozytora i aktualizację kompozytora
używać w kontrolerze
użyj w widoku zmiany w pliku config-> app.php
zadzwoń w widoku
źródło
composer.json
jest bezużyteczne, ponieważ psol-4 autoload wykona zadanie.w katalogu bootstrap \ autoload.php
dodaj ten plik
źródło
**
** stwórz nowego pomocnika
Użyj dla kontrolera i dowolnego pliku widoku
źródło
W laravel 5.3 i nowszych zespół laravel przeniósł wszystkie pliki proceduralne (
routes.php
) zapp/
katalogu, a całyapp/
folder jestpsr-4
ładowany automatycznie. Przyjęta odpowiedź zadziała w tym przypadku, ale nie wydaje mi się to właściwe.Więc zrobiłem to, że utworzyłem
helpers/
katalog w katalogu głównym mojego projektu i umieściłem w nim pliki pomocnicze, aw moimcomposer.json
pliku zrobiłem to:W ten sposób mój
app/
katalog jest nadal ładowany automatycznie przez PSR-4, a pomocnicy są nieco lepiej zorganizowani.Mam nadzieję, że to komuś pomoże.
źródło
Jest tu kilka świetnych odpowiedzi, ale myślę, że to jest najprostsze. W Laravel 5.4 (i starszych wersjach również) możesz stworzyć klasę w dogodnym dla ciebie miejscu, np. App / Libraries / Helper.php
Następnie możesz po prostu nazwać to w szablonie Blade w następujący sposób:
Jeśli nie chcesz używać @inject, po prostu ustaw funkcję „wielkich liter” jako statyczną i umieść wywołanie w szablonie Blade w następujący sposób:
Nie ma potrzeby używania aliasów. Laravel automatycznie rozwiązuje konkretną klasę.
źródło