13.x y la implementación de Framework v13.37.0, y profundiza en los fundamentos del desarrollo de paquetes. Para la sintaxis habitual de las plantillas, consulta Blade; para los espacios de nombres y la publicación de vistas, consulta Sobrescritura y actualización de vistas de paquetes.
Distinguir registro, compilación y ejecución
El callback que se pasa aBlade::directive() no devuelve el valor que se muestra, sino una cadena con el código PHP que se genera. El argumento $expression tampoco es un valor evaluado, sino la expresión PHP escrita en la plantilla.
view:cache también realiza la compilación. Diseña el callback que genera la directiva para que no obtenga el usuario actual, no escriba en la base de datos ni llame a APIs externas.
Registrar con nombres propios del paquete
Como ejemplo, se ofrece@acmeCourierLabel($code), que muestra la etiqueta configurada delante del código de envío. Se asume que el PSR-4 de Composer asigna Acme\Courier\ a src/ y que el proveedor se registra mediante el descubrimiento automático o manualmente.
src/CourierServiceProvider.php
courier.label es una cadena y courier.enabled es un booleano. Para distribuir y fusionar el archivo de configuración, consulta Fusión y caché de la configuración de paquetes.
El registro se hace en el boot() habitual del proveedor, sin envolverlo en una condición runningInConsole(). La misma extensión es necesaria tanto al renderizar por HTTP como al ejecutar view:cache de Artisan. Evita también convertir en proveedor diferido un proveedor que solo registra extensiones de Blade, ya que no se iniciaría hasta que se resolviera otro servicio.
Recibir los argumentos como expresiones, no como valores
$code. El PHP generado tiene la siguiente forma.
config() y $code se evalúan en el momento en que se ejecuta este PHP. Es distinto de una implementación en la que el propio callback lee config() y devuelve una cadena fija.
El callCustomDirective() revisado elimina los paréntesis exteriores, aplica trim a la expresión y la pasa al callback. No convierte el argumento en un valor PHP ni lo divide en argumentos individuales. Este ejemplo se publica como una sintaxis que recibe una única expresión obligatoria.
Si necesitas varios argumentos, no los separes simplemente con explode() por comas. Los arrays, las llamadas a métodos y los literales de cadena también pueden contener comas. Si quieres manejar atributos o HTML complejo, es más fácil separar responsabilidades ofreciéndolo como un componente de Blade.
Las colisiones de nombres también son un problema de compatibilidad
directive() guarda el handler en un array usando el nombre como clave. Si el nombre coincide, sobrescribe el registro anterior, y compileStatement() prioriza las directivas propias frente a los métodos de conversión integrados. Las pruebas oficiales incluyen incluso un caso en el que un registro propio sobrescribe foreach.
Evita nombres genéricos como label o enabled y los nombres integrados, y añade un prefijo propio del paquete. Trata los nombres y argumentos que los usuarios escriben en sus plantillas como una API pública y proporciona un procedimiento de migración cuando los cambies.
Evaluar las condiciones en ejecución con Blade::if
La condición registrada en el proveedor anterior se puede usar así.Blade::if() guarda el callback de la condición y registra las directivas de inicio, unless, else y cierre. En este ejemplo, la parte de inicio se convierte en el siguiente PHP.
check() en tiempo de ejecución. No fija el resultado true o false en tiempo de compilación. Por ello, el proceso HTTP que usa las vistas compiladas también necesita que el callback de la condición esté registrado.
Esta sintaxis sirve para alternar lo que se muestra, no para autorizar operaciones de envío. Aplica también el control de acceso en las rutas o en las operaciones.
Actualizar el paquete no siempre regenera las vistas automáticamente
ElCompiler::isExpired() revisado comprueba si existe la caché y, según la configuración, compara la fecha de modificación de la vista original con la del archivo compilado. No hace seguimiento de los cambios en las directivas escritas en el proveedor como archivos dependientes.
La documentación oficial también indica que, después de cambiar la lógica de una directiva, se borre la caché con
view:clear. Ejecútalo en el proceso de despliegue de la aplicación que lo usa, después de alinear el paquete actualizado con las vistas del usuario.
view:cache cuando quieras precompilar en producción. No borres la caché en cada boot() del paquete ni modifiques sin permiso el proceso de despliegue de la aplicación durante la instalación. La actualización de la caché de configuración y la recarga de procesos persistentes también deben seguir el procedimiento de despliegue habitual del entorno.
Verificar por separado el resultado compilado y el renderizado
Primero, verifica el PHP generado en una aplicación Laravel de pruebas que tenga registrado el proveedor anterior. El siguiente método se añade a una prueba Feature que hereda deTests\TestCase.
Páginas relacionadas
Sobrescritura y actualización de vistas de paquetes
Revisa el orden de búsqueda de los espacios de nombres y cómo mantener las plantillas publicadas.
Caché de paquetes e integración con optimize
Revisa cómo integrar la generación y eliminación de cachés propias en el proceso de despliegue.
Fuentes primarias consultadas
- Documentación oficial de Laravel: Extending Blade y Custom if statements
- Documentación oficial de Laravel: vistas y componentes de paquetes
- BladeCompiler: directive(), callCustomDirective(), compileStatement(), if() y check()
- Compiler: evaluación de la caché con isExpired()
- BladeCustomTest: directivas y condiciones propias, y sobrescritura de sintaxis integrada