Best practice per gli helper di Laravel 4 e le funzioni di base?


152

Sto cercando di capire il posto migliore per inserire una funzione globale in Laravel 4. Ad esempio, la formattazione della data. Non penso che valerne la pena, dato che le facciate sono troppo modulari. Ho letto articoli sulla creazione di una cartella di libreria e la memorizzazione di classi lì, ma sembra anche molto per una semplice funzione. Uno "strumento" come questo non dovrebbe essere disponibile nei modelli Blade?

Quali sono le migliori pratiche per qualcosa di simile e come posso renderlo disponibile per i modelli Blade?

Risposte:


233

Il modo brutto, pigro e terribile: Alla fine bootstrap/start.php, aggiungi un include('tools.php')e inserisci la tua funzione in quel nuovo file.

Il modo più pulito: crea una libreria. In questo modo verrà caricato automaticamente SOLO quando lo si utilizza effettivamente.

  • Crea una librariescartella all'interno della tua appcartella
  • Crea il tuo file di libreria, crea una classe e aggiungi funzioni statiche
  • Opzione 1 : Modifica start/global.phpper aggiungere app_path().'/libraries'alla ClassLoader::addDirectories( matrice.
  • Opzione 2 : Modifica composer.jsonper aggiungere "app/libraries"alla autoloadmatrice. Correrecomposer dump-autoload
  • Chiama la tua classe e le funzioni statiche dai tuoi punti di vista.

Informazioni sulle opzioni, citate dal global.phpfile

Oltre a utilizzare Composer, è possibile utilizzare il caricatore di classi Laravel per caricare controller e modelli. Ciò è utile per mantenere tutte le classi nello spazio dei nomi "globale" senza l'aggiornamento di Composer.

È possibile combinare entrambe le opzioni, in cui il caricatore di classi Laravel cercherà automaticamente le classi nelle directory registrate ( Opzione 1 , più semplice) e Composer registrerà tutte le classi ma solo dopo averlo aggiornato ( Opzione 2 , potrebbe migliorare le prestazioni).


3
Penso che anche tu debba inserire app_path().'/library', in start / global.php.
Alexandre Butynski,

2
@AlexandreButynski Ottimo punto. Ciò consentirà di aggiungere librerie senza dover aggiornare il compositore ogni volta. Ho modificato il mio post per aggiungere questo.
Alexandre Danault,

Quindi creo una classe chiamata IDK ... SiteHelpers e quindi definisco un metodo formatDate. e poi nel modello dovrei essere in grado di fare SiteHelpers :: formatDate ($ date)?
Jason Spick,

@JasonSpick Sì, e assicurati di nominare il tuo filesitehelpers.php
Alexandre Danault,

3
Perché è necessario aggiungerlo al caricamento automatico del compositore e al file global.php?
CashIsClay

82

Il mio modo di farlo è quello di creare una nuova cartella nella /appdirectory nella radice del progetto Laravel 4. Quindi aggiungi questa cartella al primo array del /app/start/global.phpfile in questo modo:

<?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.

));

Finché la struttura delle cartelle all'interno della nuova /app/classescartella segue la convenzione di spaziatura dei nomi. Laravel 4 caricherà automaticamente tutte le classi / file all'interno di questa cartella. In questo modo non è necessario scavare in alcun file del compositore o eseguire il comando del compositore.

Non sono sicuro se questa è la migliore pratica ma sicuramente funziona.

Se hai creato un file semplice chiamato /app/classes/Helpers/Helper.phpcome questo:

<?php namespace Helpers;

class Helper {

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

Tutto quello che dovresti fare è chiamare Helpers\Helper::helloWorld();

Puoi anche alias questa classe di supporto nel tuo /app/config/app.phpfile. Aggiungi qualcosa di simile alla fine aliasesdell'array:

'Helper'          => 'Helpers\Helper'

4
Mi piace in questo modo perché non devi mescolarti con nulla del compositore, una soluzione pulita e di classe. +1
Gadoma,

3
Se dovessi aggiungere la tua classe helper al tuo file app.php ora puoi accedere direttamente alla classe in questo modo: Helper :: hellowWorld ();
Helmut Granda,

l'helper dovrebbe essere una classe? posso definire una semplice funzione qui?
Webinan,

2
Questo non funziona se non modifichi il composer.json e non esegui il compositore dumpautoload
Rommy

1
Ottima soluzione Come dice Rommy, non dimenticare di correre composer dump-autoload: l'ho fatto e ho passato 20 minuti a grattarmi la testa.
al_manchester,

25

Il metodo helpers.php di Laravel è quello di aggiungerlo ai tuoi "file" in composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

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

Quello che faccio è creare piccole classi (alcuni metodi per classe, una riga per metodo, tutto esteso da qualcosa e DRY, questo è il mio obiettivo),

class ExtendedCarbon extends Carbon\Carbon {

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

}

salvali su di essi in app / librerie e aggiungi a composer.json:

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

Eseguire

composer dump

E poi usali dove vuoi

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

Guarda questo video sul refactoring: http://www.youtube.com/watch?v=DC-pQPq0acs

A proposito, sono sicuro che fosse solo un esempio, ma potresti non aver bisogno di un aiuto per formattare le date, dal momento che tutte le date in Laravel sono istanze di Carbon ( https://github.com/briannesbitt/Carbon ) e ha molti metodi per formattare data e ora.


Io stesso non sono un grande fan dei metodi statici e provo a usare i metodi di istanza quando necessario. Bug Sono abbastanza sicuro che nel caso di tale uso, si sarebbe molto meglio di avere formatDDMMAAAA()come static.
XedinSconosciuta il

7

È inoltre possibile utilizzare View::share()insieme alle chiusure per raggiungere questo obiettivo - Ho appena pubblicato su questo: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Vantaggio aggiunto: non è necessario creare una classe aggiuntiva e mantenere pulito lo spazio dei nomi globale.


Mi piace questo approccio. Più ferrovia. Potremmo in qualche modo aggiungere tutti i metodi di supporto alla vista all'interno di un tratto e renderli disponibili nella vista lama?
bibstha,

Non credo che sia possibile con PHP, a dire il vero.
Franz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.