¿Mejores prácticas para ayudantes y funciones básicas de Laravel 4?

152

Estoy tratando de entender el mejor lugar para poner una función global en Laravel 4. Por ejemplo, el formato de fecha. No creo que valga la pena hacer una fachada ya que las fachadas son demasiado modulares. He leído artículos sobre cómo crear una carpeta de biblioteca y almacenar clases allí, pero eso también parece mucho para una función simple. ¿No debería estar disponible una 'herramienta' como esta en las plantillas de Blade?

¿Cuáles son las mejores prácticas para algo como esto y cómo lo hago disponible para las plantillas de Blade?

Jason Spick
fuente

Respuestas:

233

La manera fea, perezosa y horrible: al final de bootstrap/start.php, agregue una include('tools.php')y coloque su función en ese nuevo archivo.

La manera limpia: crear una biblioteca. De esa manera, se cargará automáticamente SOLO cuando realmente lo uses.

  • Crea una librariescarpeta dentro de tu appcarpeta
  • Cree su archivo de biblioteca, cree una clase en él y agréguele funciones estáticas
  • Opción 1 : Editar start/global.phppara agregar app_path().'/libraries'a la ClassLoader::addDirectories( matriz.
  • Opción 2 : Editar composer.jsonpara agregar "app/libraries"a la autoloadmatriz. corrercomposer dump-autoload
  • Llame a su clase y funciones estáticas desde sus puntos de vista.

Sobre sus opciones, citadas del global.phparchivo

Además de usar Composer, puede usar el cargador de clases Laravel para cargar sus controladores y modelos. Esto es útil para mantener todas sus clases en el espacio de nombres "global" sin la actualización de Composer.

Puede combinar ambas opciones, donde el cargador de clases de Laravel buscará automáticamente clases en los directorios registrados ( Opción 1 , más fácil) y Composer mantendrá un registro de todas las clases, pero solo después de actualizarlo ( Opción 2 , podría mejorar el rendimiento).

Alexandre Danault
fuente
3
Creo que también debes colocarlo app_path().'/library'en start / global.php.
Alexandre Butynski
2
@AlexandreButynski Buen punto. Esto permitirá agregar bibliotecas sin tener que actualizar el compositor cada vez. Edité mi publicación para agregar esto.
Alexandre Danault
Así que creo una clase llamada IDK ... SiteHelpers y luego defino un método formatDate. y luego en la plantilla debería poder hacer SiteHelpers :: formatDate ($ date)?
Jason Spick
@JasonSpick Sí, y asegúrese de nombrar su archivositehelpers.php
Alexandre Danault
3
¿Por qué necesita agregarlo a la carga automática del compositor, así como al archivo global.php?
CashIsClay
82

Mi forma de hacerlo es crear una nueva carpeta en el /appdirectorio en la raíz de su proyecto Laravel 4. Luego agregue esta carpeta a la primera matriz del /app/start/global.phparchivo de la siguiente manera:

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

));

Siempre que la estructura de carpetas dentro de la nueva /app/classescarpeta siga su convención de espacio de nombres. Laravel 4 cargará automáticamente todas las clases / archivos dentro de esta carpeta. De esta manera no hay necesidad de profundizar en ningún archivo de compositor o ejecutar el comando de compositor.

No estoy seguro si esta es la mejor práctica, pero ciertamente funciona.

Si creó un archivo simple llamado /app/classes/Helpers/Helper.phpcomo este:

<?php namespace Helpers;

class Helper {

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

Todo lo que necesitas hacer es llamar Helpers\Helper::helloWorld();

También puede alias esta clase auxiliar en su /app/config/app.phparchivo. Simplemente agregue algo como esto al final de la aliasesmatriz:

'Helper'          => 'Helpers\Helper'
JasonMortonNZ
fuente
44
Me gusta de esta manera porque no tienes que mezclarte con nada compositor-ish, una solución limpia y con clase. +1
Gadoma
3
Si tuviera que agregar su clase de ayuda a su archivo app.php, ahora puede acceder a la clase directamente así: Helper :: hellowWorld ();
Helmut Granda
¿El ayudante debería ser una clase? ¿Puedo definir una función simple aquí?
Webinan
2
Esto no funciona si no edita el composer.json y no ejecuta el compositor dumpautoload
Rommy
1
Gran solución Como dice Rommy, no te olvides de correr composer dump-autoload, lo hice y pasé 20 minutos rascándome la cabeza.
al_manchester
25

El método helpers.php de Laravel es agregarlo a sus "archivos" en composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

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

Lo que hago es crear clases pequeñas (algunos métodos por clase, una línea por método, todo se extiende desde algo y DRY, ese es mi objetivo),

class ExtendedCarbon extends Carbon\Carbon {

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

}

guárdelos en aplicaciones / bibliotecas y agréguelos a composer.json:

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

Ejecutar

composer dump

Y luego úsalos donde necesites

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

Mire este video sobre refactorización: http://www.youtube.com/watch?v=DC-pQPq0acs

Por cierto, estoy seguro de que fue solo un ejemplo, pero es posible que no necesite un ayudante para formatear fechas, ya que todas las fechas en Laravel son instancias de carbono ( https://github.com/briannesbitt/Carbon ) y Tiene muchos métodos para formatear la fecha y la hora.

Antonio Carlos Ribeiro
fuente
No soy tan fanático de los métodos estáticos, y trato de usar métodos de instancia cuando sea necesario. Bug Estoy bastante seguro de que en el caso de tal uso, que sería mucho mejor de tener formatDDMMAAAA()como static.
Xedin Desconocido el
7

También puede usarlo View::share()junto con los cierres para lograr esto: acabo de publicar sobre esto: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Beneficio adicional: no necesita crear una clase adicional y también mantener limpio el espacio de nombres global.

Franz
fuente
Me gusta este enfoque. Más carril-ish. ¿Podríamos de alguna manera agregar todos los métodos de ayuda de vista dentro de un rasgo y tenerlos disponibles en la vista de hoja?
bibstha
No creo que sea posible con PHP, para ser honesto.
Franz