IronWoods.es

Desarrollo web

Blog / Laravel / Como añadir nuestras propias clases

Laravel dispone de los Service Providers para añadir nuestras clases / librerías (sin composer) a la aplicación que estamos desarrollando. Son clases especiales que usamos para enlazar o bindear clases al framework.

Paso a paso...

Como ejemplo, voy a añadir una librería básica para 'debug'. Como ya disponía de una clase principal con acceso a todos sus métodos sólo hubo que ajustar el namespace antes de bindearla.

1. Ubicación para la librería.

Se necesita un directorio para alojar nuestras librerías, como "app/Libraries/". La primera vez que añadimos una librería tendremos que crearlo.

2. Añadir la librería.

Añadimos la carpeta con nuestra librería al directorio creado. Es importante que los nombres de directorio no tengan espacios ni guiones (se aceptan guiones bajos). Deben cumplirse las recomendaciones sobre el uso de namespaces y su concordancia con el árbol de directorios.

Como mi clase principal esta ubicada en: "app/Libraries/dtraz/dtraz.php", su namespace deberá ser: "App\Libraries\dtraz". ¡Ésto es lo que hace que el bindeo funcione!

3. Crear el Service Provider.

Ésta clase nos permite bindear la clase principal de la librería. La forma más habitual de hacerlo será usando artisan:

artisan make:provider DTrazProvider


o mejor:

artisan make:provider DTrazServiceProvider


Con éste segundo comando seguimos la nomenclatura usada por Laravel con los providers que ya contiene, como RouteServiceProvider que define donde se encuentran las rutas de la aplicación.

4. Registrar la librería.

Registramos la librería en "DTrazServiceProvider" en su método register(). Quedaría así:

/**

 * Register the application services.

 *

 * @return void

 */

public function register() {

\App::bind( 'DTraz' );

}


Otras formas equivalentes serían:

\App::bind(

'build',

function() {

return new \App\Libraries\dtraz\DTraz;

}

);


\App::bind(

'build',

'App\Libraries\dtraz\DTraz'

);


\App::bind(

'DTraz',

'App\Libraries\dtraz\DTraz'

);


Podemos bindear más de una clase en un mismo service provider, dentro de su método register(), simplemente añadiendo una declaración tras otra:

\App::bind( 'MiClase' );

\App::bind( 'OtraClase' );


Si bien, deberíamos crear una clase NombreClaseServiceProvider por cada clase a enlazar.

Además, para hacer el bindeo podemos usar alternativamente:

\App::bind( 'MiClase' );


o bien:

$this->app->bind( 'MiClase' );


Con ésto tendríamos registrada nuestra clase en el service provider creado a tal efecto, ahora queda registrar éste en la aplicación.

5. Registrar el Service Provider.

Agregar "DTrazServiceProvider" a la lista de providers del fichero "config/app.php".

'providers' => [

/*

 * Laravel Framework Service Providers...

 */

Illuminate\Foundation\Providers\ArtisanServiceProvider::class,

...


/*

 * Application Service Providers...

 */

App\Providers\AppServiceProvider::class,

...


/*

 * Clases propias

 */

App\Providers\DTrazServiceProvider::class,

],


Ahora, si todo fue bien, la librería DTraz, estará operativa.

6. Prueba de la librería.

Podemos hacer una prueba rápida en el fichero "routes.php":

Route::get(

'hola-mundo',

function() {

if ( class_exists( 'App\Libraries\dtraz\DTraz' ))

App\Libraries\dtraz\DTraz::prob( 'Hola mundo' );


else

dd( 'ERR -> Clase "DTraz" no encontrada' );

}

);

Finalizando... Creando un alias para nuestra clase

Puede ser engorroso tener que llamar a la clase escribiendo el namespace completo, para agilizar se usan los alias.

Usando un alias el código de prueba quedaría así:

Route::get(

'hola-mundo',

function() {

if ( class_exists( 'App\Libraries\dtraz\DTraz' ))

\Dtraz::prob( 'Hola mundo' );


else

dd( 'ERR -> Clase "DTraz" no encontrada' );

}

);


Para crear un alias de nuestra clase basta con añadir una línea en el array "aliases" en el fichero "config/app.php":

'Dtraz' => 'App\Libraries\dtraz\DTraz',


o bien:

'Dtraz' => App\Libraries\dtraz\DTraz::class,


Además, podemos crear más de un alias para nuestra clase, añadiéndolos en el array de "aliases". Quiero poder usar "Dtraz" y "Dtz" para llamar a mi clase, por ejemplo, para mantener compatibilidad con código antiguo. Las líneas serían:

'Dtraz' => App\Libraries\dtraz\DTraz::class,

'Dtz'   => App\Libraries\dtraz\DTraz::class,


Y el código de prueba:

Route::get(

'hola-mundo',

function() {

if ( class_exists( 'App\Libraries\dtraz\DTraz' )) {

\Dtraz::prob( 'Hola mundo' );

\Dtz::prob( 'by Moisés Alcocer' );


} else

dd( 'ERR -> Clase "DTraz" no encontrada' );

}

);


Nota: he usado la barra de namespaces al llamar a los alias en las pruebas del fichero "routes.php". En este fichero, las llamadas funcionan sin ella, si bien se requiere en los controladores y otras clases de la aplicación, por lo que resulta conveniente la práctica de usarla.