Najlepsze praktyki dla pomocników Laravel 4 i podstawowych funkcji?


152

Próbuję zrozumieć najlepsze miejsce na umieszczenie funkcji globalnej w Laravel 4. Na przykład formatowanie daty. Nie sądzę, aby wykonanie elewacji było tego warte, ponieważ elewacje są zbyt modułowe. Czytałem artykuły o tworzeniu folderu biblioteki i przechowywaniu tam klas, ale wydaje się to również dużo dla prostej funkcji. Czy takie „narzędzie” nie powinno być dostępne w szablonach Blade?

Jakie są najlepsze praktyki w przypadku czegoś takiego i jak udostępnić to szablonom Blade?

Odpowiedzi:


233

Brzydki, leniwy i okropny sposób: na koniec bootstrap/start.phpdodaj include('tools.php')i umieść swoją funkcję w tym nowym pliku.

Czysty sposób: Utwórz bibliotekę. W ten sposób zostanie automatycznie załadowany TYLKO wtedy, gdy faktycznie go użyjesz.

  • Utwórz librariesfolder w swoim appfolderze
  • Utwórz plik biblioteki, utwórz w nim klasę i dodaj do niej funkcje statyczne
  • Opcja 1 : Edytuj, start/global.phpaby dodać app_path().'/libraries'do ClassLoader::addDirectories( macierzy.
  • Opcja 2 : Edytuj, composer.jsonaby dodać "app/libraries"do autoloadmacierzy. Biegaćcomposer dump-autoload
  • Wywołaj swoją klasę i funkcje statyczne z widoków.

O twoich opcjach, cytowane z global.phppliku

Oprócz korzystania z Composera, możesz użyć programu ładującego klasy Laravel do załadowania kontrolerów i modeli. Jest to przydatne do utrzymywania wszystkich klas w „globalnej” przestrzeni nazw bez aktualizacji Composera.

Możesz połączyć obie opcje, w których moduł ładujący klasy Laravel automatycznie wyszuka klasy w zarejestrowanych katalogach ( opcja 1 , łatwiejsza), a Composer będzie zapisywać wszystkie klasy, ale dopiero po jej zaktualizowaniu ( opcja 2 , może poprawić wydajność).


3
Myślę, że musisz również umieścić app_path().'/library'w start / global.php.
Alexandre Butynski

2
@AlexandreButynski Słuszna uwaga. Umożliwi to dodawanie bibliotek bez konieczności każdorazowego aktualizowania programu Composer. Edytowałem swój post, aby to dodać.
Alexandre Danault

Więc tworzę klasę o nazwie IDK ... SiteHelpers, a następnie definiuję metodę formatDate. a następnie w szablonie powinienem być w stanie zrobić SiteHelpers :: formatDate ($ date)?
Jason Spick

@JasonSpick Tak, i upewnij się, że sitehelpers.php
nadałeś

3
Dlaczego musisz dodać go do automatycznego ładowania kompozytora, a także do pliku global.php?
CashIsClay

82

Mój sposób na zrobienie tego polega na utworzeniu nowego folderu w /appkatalogu głównym projektu Laravel 4. Następnie dodaj ten folder do pierwszej tablicy /app/start/global.phppliku w następujący sposób:

<?php

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.

));

O ile struktura folderów w nowym /app/classesfolderze jest zgodna z konwencją dotyczącą przestrzeni nazw. Laravel 4 automatycznie załaduje wszystkie klasy / pliki w tym folderze. W ten sposób nie ma potrzeby zagłębiania się w żadne pliki kompozytora ani uruchamiania polecenia kompozytora.

Nie jestem pewien, czy to najlepsza praktyka, ale z pewnością działa.

Jeśli utworzyłeś prosty plik o nazwie /app/classes/Helpers/Helper.phptakiej jak ten:

<?php namespace Helpers;

class Helper {

    public static function helloWorld()
    {
        return 'Hello World';
    }
}

Wystarczy, że zadzwonisz Helpers\Helper::helloWorld();

Możesz również aliasować tę klasę pomocniczą w swoim /app/config/app.phppliku. Po prostu dodaj coś takiego na końcu aliasestablicy:

'Helper'          => 'Helpers\Helper'

4
Podoba mi się ten sposób, ponieważ nie musisz mieszać się z niczym kompozytorskim, czyste i eleganckie rozwiązanie. +1
Gadoma,

3
Gdybyś miał dodać klasę pomocniczą do pliku app.php, możesz teraz uzyskać bezpośredni dostęp do klasy w następujący sposób: Helper :: hellowWorld ();
Helmut Granda,

czy pomocnik powinien być klasą? czy mogę tutaj zdefiniować prostą funkcję?
Webinan

2
To nie zadziała, jeśli nie edytujesz pliku composer.json i nie uruchomisz pliku composer dumpautoload
Rommy.

1
Świetne rozwiązanie. Jak mówi Rommy, nie zapomnij biegać composer dump-autoload- zrobiłem to i spędziłem 20 minut na drapaniu się po głowie.
al_manchester,

25

Metoda helpers.php Laravela polega na dodaniu go do swoich "plików" w pliku composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

"autoload": {
    "classmap": [
        ...
    ],
    "files": [
        "app/libraries/helpers.php"
    ],
},

Robię małe klasy (kilka metod na klasę, jedna linia na metodę, wszystko rozszerzone z czegoś i DRY, to mój cel),

class ExtendedCarbon extends Carbon\Carbon {

    public function formatDDMMAAAA($date)
    {
        /// format and return
    }

}

zapisz je do nich w aplikacji / bibliotekach i dodaj do composer.json:

"autoload": {
    "classmap": [
        ...
        "app/libraries",
        ...
    ],
},

Wykonać

composer dump

A potem po prostu używaj ich tam, gdzie potrzebujesz

$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);

Obejrzyj ten film o refaktoryzacji: http://www.youtube.com/watch?v=DC-pQPq0acs

Nawiasem mówiąc, jestem pewien, że to tylko przykład, ale możesz nie potrzebować pomocnika do formatowania dat, ponieważ wszystkie daty w Laravel są instancjami Carbon ( https://github.com/briannesbitt/Carbon ) i ma mnóstwo metod formatowania daty i czasu.


Sam nie jestem wielkim fanem metod statycznych i w razie potrzeby staram się używać metod instancji. Błąd Jestem pewien, że w przypadku takiego użycia dużo lepiej byłoby mieć formatDDMMAAAA()jako static.
XedinUnknown

7

Możesz również użyć View::share()razem z zamknięciami, aby to osiągnąć - właśnie opublikowałem o tym: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Dodatkowa korzyść: nie musisz tworzyć dodatkowej klasy, a także utrzymywać czystość globalnej przestrzeni nazw.


Podoba mi się to podejście. Więcej kolejnictwa. Czy moglibyśmy jakoś dodać wszystkie metody pomocnicze do widoku wewnątrz cechy i mieć je dostępne w widoku ostrza?
bibstha

Szczerze mówiąc, nie wydaje mi się to możliwe w przypadku PHP.
Franz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.