Me gustaría crear funciones auxiliares para evitar repetir el código entre vistas en Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Básicamente son funciones de formato de texto. ¿Dónde y cómo puedo crear un archivo con estas funciones?
php
laravel
laravel-5
laravel-helper
Calebe Oliveira
fuente
fuente
Clases personalizadas en Laravel 5, la manera fácil
Esta respuesta es aplicable a las clases personalizadas generales dentro de Laravel. Para obtener una respuesta más específica de Blade, consulte Directivas de Blade personalizadas en Laravel 5 .
Paso 1: cree su archivo Helpers (u otra clase personalizada) y asígnele un espacio de nombres coincidente. Escribe tu clase y método:
Paso 2: crea un alias:
Paso 3: ejecutar
composer dump-autoload
en la raíz del proyectoPaso 4: Úselo en su plantilla Blade:
Crédito adicional: use esta clase en cualquier lugar de su aplicación Laravel:
Fuente: http://www.php-fig.org/psr/psr-4/
Por qué funciona: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
De dónde se origina la carga automática: http://php.net/manual/en/language.oop5.autoload.php
fuente
aliases
matriz enapp/config.php
:'Helper' => App\Helpers\Helper::class,
Entonces podrá llamarHelper::prettyJson();
a Blade muy bien.mi pensamiento inicial fue la carga automática del compositor también, pero no me pareció muy Laravel 5ish. L5 hace un uso intensivo de los proveedores de servicios, que son los que inician su aplicación.
Para comenzar, creé una carpeta en mi
app
directorio llamadaHelpers
. Luego, dentro de laHelpers
carpeta, agregué archivos para las funciones que quería agregar. Tener una carpeta con varios archivos nos permite evitar un archivo grande que se vuelve demasiado largo e inmanejable.Luego creé un
HelperServiceProvider.php
ejecutando el comando artesanal:Dentro del
register
método agregué este fragmentopor último, registre el proveedor de servicios en su
config/app.php
en la matriz de proveedoresahora cualquier archivo en su
Helpers
directorio está cargado y listo para usar.ACTUALIZACIÓN 2016-02-22
Aquí hay muchas buenas opciones, pero si mi respuesta funciona para usted, seguí adelante e hice un paquete para incluir ayudantes de esta manera. Puede utilizar el paquete como inspiración o descargarlo también con Composer. Tiene algunos ayudantes integrados que uso a menudo (pero que están inactivos por defecto) y le permite crear sus propios ayudantes personalizados con un simple generador Artisan. También aborda la sugerencia que tenía un respondedor de usar un mapeador y le permite definir explícitamente los ayudantes personalizados para cargar, o por defecto, cargar automáticamente todos los archivos PHP en su directorio auxiliar. Comentarios y relaciones públicas son muy apreciados!
Github: browner12 / helpers
fuente
start.php
archivo (que no fue genial, pero cumplió su propósito por el momento). ¿Tienes otra sugerencia para cargar varios archivos?Esto es lo que sugiere
JeffreyWay
esta Discusión de Laracasts .app/Http
directorio, cree unhelpers.php
archivo y agregue sus funciones.composer.json
, en elautoload
bloque, agregue"files": ["app/Http/helpers.php"]
.composer dump-autoload
.fuente
app/helpers.php
oapp/Helpers/
parece ser un lugar mejor.composer dump-autoload
?composer dump-autoload
puede seguir esto: developed.be/2014/08/29/composer-dump-autoload-laravelHabiendo examinado una variedad de respuestas en SO y Google, todavía no pude encontrar un enfoque óptimo. La mayoría de las respuestas sugieren que abandonemos la aplicación y confiemos en la herramienta de terceros Composer para hacer el trabajo, pero no estoy convencido de que sea conveniente acoplar una herramienta solo para incluir un archivo.
La respuesta de Andrew Brown fue lo más parecido a cómo creo que debería abordarse, pero (al menos en 5.1), el paso del proveedor de servicios es innecesario. La respuesta de Heisian destaca el uso de lo
PSR-4
que nos acerca un paso más. Aquí está mi implementación final para ayudantes en vistas:Primero, cree un archivo auxiliar en cualquier lugar de su directorio de aplicaciones, con un espacio de nombres:
A continuación, alias su clase en
config\app.php
, en laaliases
matriz:Y eso debería ser todo lo que necesitas hacer.
PSR-4
y el alias debe exponer el ayudante a sus vistas, por lo que en su vista, si escribe:Debería generar:
fuente
{!! bob() !!}
. vamos a buscar un poco más y ver si eso es posiblebob()
verdaderamente global no sería una buena idea . Los espacios de nombres están ahí por una razón y no deberíamos llamarbob()
junto con las funciones básicas de PHP. Agregaré su bit de alias a mi código, ¡gracias!extends Helper
? No me parece necesario.extends Helper
hecho, no es necesario. Gracias por el aviso.Directivas de cuchillas personalizadas en Laravel 5
¡Sí, hay otra forma de hacer esto!
Paso 1: Registre una directiva Blade personalizada:
Paso 2: usa tu directiva Blade personalizada:
Salidas:
¡ESTA ES MI DIRECTIVA DE CUCHILLA PERSONALIZADA!
Enlace personalizado
Fuente: https://laravel.com/docs/5.1/blade#extending-blade
Lectura adicional: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
Si desea aprender cómo crear clases personalizadas que pueda usar en cualquier lugar , consulte Clases personalizadas en Laravel 5, la manera fácil
fuente
Este es mi archivo HelpersProvider.php:
Debe crear una carpeta llamada
Helpers
debajo de laapp
carpeta, luego crear un archivo llamadowhatever.php
dentro y agregar la cadenawhatever
dentro de la matriz $ helpers.¡Hecho!
Editar
Ya no estoy usando esta opción, actualmente estoy usando Composer para cargar archivos estáticos como ayudantes.
Puede agregar los ayudantes directamente en:
fuente
glob()
como escribió Andrew Brown? Si desea poder especificar los archivos que desea incluir, ¿por qué no especificar los archivos en lacomposer.json
carga automática como escribió Joseph Silber? ¿Por qué prefieres esta solución? No digo que sea una mala solución, solo tengo curiosidad.composer.json
excepto por dos puntos: primero, mantiene el mapa dentro de la aplicación en sí, en lugar de un archivo de metadatos; segundo, no requiere que vuelva a ejecutarcomposer dump-autoload
cada vez que cambia la lista de archivos para cargar.include
orequire
, Laravel ya tiene una carga automática de PSR-4 incorporadaPara las bibliotecas auxiliares personalizadas en mi proyecto Laravel, he creado una carpeta con nombre
Libraries
en miLaravel/App
directorio y dentro del directorio de bibliotecas, he creado varios archivos para diferentes bibliotecas auxiliares.Después de crear mis archivos auxiliares, simplemente incluyo todos esos archivos en mi archivo composer.json como este
y ejecutar
fuente
composer dump-autoload
ycomposer dumpautoload
también funciona de hechocomposer du
también funcionará ...Como OP solicitó las mejores prácticas , creo que todavía nos faltan algunos buenos consejos aquí.
Un solo archivo helpers.php está lejos de ser una buena práctica. En primer lugar, porque mezclas muchos tipos diferentes de funciones, por lo que estás en contra de los buenos principios de codificación. Además, esto podría dañar no solo la documentación del código, sino también las métricas del código como la Complejidad Ciclomática , el Índice de Mantenibilidad y el Volumen de Halstead . Cuantas más funciones tenga, más empeorará.
Documentación de código no estaría mal uso de herramientas como phpDocumentor , pero utilizando Sami que no va a hacer que los ficheros de procedimiento . La documentación de Laravel API es un caso así: no hay documentación de funciones auxiliares: https://laravel.com/api/5.4
Las métricas de código se pueden analizar con herramientas como PhpMetrics . El uso de PhpMetrics versión 1.x para analizar el código marco de Laravel 5.4 le dará muy malas métricas CC / MI / HV para src / Illuminate / Foundation / helpers.php y src / Illuminate / Support / helpers.php archivos .
Múltiples archivos auxiliares contextuales (por ejemplo , string_helpers.php , array_helpers.php , etc.) ciertamente mejorarían esas métricas malas, lo que resultaría en un código más fácil de mantener. Dependiendo del generador de documentación de código utilizado, esto sería lo suficientemente bueno.
Se puede mejorar aún más mediante el uso de clases auxiliares con métodos estáticos para que puedan contextualizarse utilizando espacios de nombres. Al igual que Laravel ya lo hace con
Illuminate\Support\Str
y lasIlluminate\Support\Arr
clases. Esto mejora tanto la métrica / organización del código como la documentación. Los alias de clase podrían usarse para hacerlos más fáciles de usar.La estructuración con clases mejora la organización y la documentación del código, pero, por otro lado, terminamos perdiendo esas funciones globales breves y fáciles de recordar. Podemos mejorar aún más ese enfoque creando alias de función para esos métodos de clases estáticas. Esto se puede hacer de forma manual o dinámica.
Laravel usa internamente el primer enfoque declarando funciones en los archivos auxiliares de procedimiento que se asignan a los métodos de clases estáticas. Esto podría no ser lo ideal, ya que necesita volver a declarar todas las cosas (bloques de documentos / argumentos).
Personalmente uso un enfoque dinámico con una
HelperServiceProvider
clase que crea esas funciones en el tiempo de ejecución:Se puede decir que esto se debe a la ingeniería, pero no lo creo. Funciona bastante bien y, al contrario de lo que cabría esperar, no cuesta un tiempo de ejecución relevante al menos cuando se usa PHP 7.x.
fuente
Aquí hay un script de shell bash que creé para hacer las fachadas de Laravel 5 muy rápidamente.
Ejecute esto en su directorio de instalación de Laravel 5.
Llámalo así:
Ejemplo:
Si ejecuta ese ejemplo, creará los directorios
Facades
yProviders
debajo de 'your_laravel_installation_dir / app / MyApp'.Creará los siguientes 3 archivos y también los enviará a la pantalla:
Una vez hecho esto, mostrará un mensaje similar al siguiente:
Actualice la lista de proveedores y alias en 'config / app.php'
correr
composer -o dumpautoload
El "./app/MyApp/Facades/Helper.php" originalmente se verá así:
Ahora solo agregue sus métodos en "./app/MyApp/Facades/Helper.php".
Así es como se ve "./app/MyApp/Facades/Helper.php" después de agregar una función de ayuda.
Esta función espera un patrón y puede aceptar un segundo argumento booleano opcional.
Si la URL actual coincide con el patrón que se le pasó, generará 'active' (o 'class = "active"' si agrega 'true' como segundo argumento a la llamada a la función).
Lo uso para resaltar el menú que está activo.
A continuación se muestra el código fuente de mi script. Espero que lo encuentre útil y avíseme si tiene algún problema.
fuente
en lugar de incluir su clase auxiliar personalizada, en realidad puede agregar a su
config/app.php
archivo con alias.Debería verse así.
y luego a su Controlador, incluya el Helper usando el método 'use Helper' para que simplemente pueda llamar a algunos de los métodos en su clase Helper.
o en la vista de recursos ya puede llamar directamente a la clase Helper.
Pero este sigue siendo el enfoque de estilo de codificación de desarrollador a seguir. Es posible que tengamos una forma diferente de resolver problemas, y solo quiero compartir lo que tengo también para principiantes.
fuente
Crear directorio de ayudantes personalizado: Primero cree el directorio de ayudantes en el directorio de la aplicación. Crear definición de clase hlper: ahora creemos una función auxiliar simple que concatene dos cadenas. Cree un nuevo archivo MyFuncs.php en /app/Helpers/MyFuncs.php Agregue el siguiente código
App de espacio de nombres \ Helpers; define el espacio de nombres Helpers en el espacio de nombres de la aplicación. La clase MyFuncs {…} define la clase auxiliar MyFuncs. public static function full_name ($ first_name, $ last_name) {…} define una función estática que acepta dos parámetros de cadena y devuelve una cadena concatenada
El servicio de ayuda proporciona clase
Los proveedores de servicios se utilizan para cargar automáticamente las clases. Tendremos que definir un proveedor de servicios que cargue todas nuestras clases de ayuda en el directorio / app / Helpers.
Ejecute el siguiente comando artesanal:
php artisan make: proveedor HelperServiceProvider
El archivo se creará en
/app/Providers/HelperServiceProvider.php
Agregue el siguiente código:
AQUÍ,
Ahora necesitamos registrar el HelperServiceProvider y crear un alias para nuestros ayudantes.
Abrir
/config/app.php
archivoLocalice la variable de matriz de proveedores
Agregue la siguiente línea
Localice la variable de matriz de alias
Agregue la siguiente línea
Guarde los cambios con nuestro ayudante personalizado
Crearemos una ruta que llamará a nuestra función auxiliar personalizada Abrir /app/routes.php
Agregue la siguiente definición de ruta
AQUÍ,
fuente
Primero cree helpers.php dentro del directorio App \ Http. Luego agregue el siguiente código dentro del composer.json
Luego ejecute el siguiente comando
Ahora puede definir su función personalizada dentro del archivo helpers.php.
fuente
Otra forma que utilicé fue: 1) creó un archivo en app \ FolderName \ fileName.php y tenía este código dentro, es decir
2) Después de eso en nuestra cuchilla
Eso es. y funciona
fuente
La mejor práctica para escribir ayudantes personalizados es
1) Dentro del
app
directorio de la raíz del proyecto, cree una carpeta llamada Helpers (solo para separar y estructurar el código).2) Dentro de la carpeta escriba archivos psr-4 o archivos php normales
Si los archivos PHP tienen el formato psr-4, se cargarán automáticamente; de lo contrario, agregue la siguiente línea en composer.json, que se encuentra dentro del directorio raíz del proyecto.
Dentro de la
autoload
clave, cree una nueva clave llamadafiles
para cargar archivos en el momento de la carga automática, dentro delfiles
objeto agregue la ruta a partir del directorio de la aplicación. Aquí hay un ejemplo.PD: intente ejecutar
composer dump-autoload
si el archivo no se carga.fuente
Cree Helpers.php en la aplicación / Helper / Helpers.php
Agregar compositor y actualización de compositor
utilizar en controlador
usar en vista cambiar en el archivo config-> app.php
llamar a la vista
fuente
composer.json
es inútil, ya que la carga automática de psr-4 hará el trabajo.en dir bootstrap \ autoload.php
agrega este archivo
fuente
** **
** crear nuevo ayudante
Úselo para el controlador y cualquier archivo de vista
fuente
En laravel 5.3 y superior, el equipo de laravel movió todos los archivos de procedimiento (
routes.php
) fuera delapp/
directorio, y toda laapp/
carpeta sepsr-4
carga automáticamente. La respuesta aceptada funcionará en este caso, pero no me parece correcta.Entonces, lo que hice fue crear un
helpers/
directorio en la raíz de mi proyecto y poner los archivos auxiliares dentro de eso, y en micomposer.json
archivo hice esto:De esta manera, mi
app/
directorio sigue siendo uno con carga automática de psr-4, y los ayudantes están un poco mejor organizados.Espero que esto ayude a alguien.
fuente
Aquí hay algunas respuestas geniales, pero creo que esta es la más simple. En Laravel 5.4 (y probablemente también en versiones anteriores) puede crear una clase en algún lugar conveniente para usted, por ejemplo, App / Libraries / Helper.php
Luego, simplemente puede llamarlo en su plantilla Blade de esta manera:
Si no desea utilizar @inject, simplemente haga que la función 'uppercasePara' sea estática e inserte la llamada en su plantilla Blade de esta manera:
No hay necesidad de alias. Laravel resuelve la clase concreta automáticamente.
fuente