En otras palabras, los proveedores de servicios son como un embudo a través del cual vertemos combustible de "clase" en un tanque llamado "contenedor de servicio" de un motor llamado Laravel.
Si abrimos config/app.php veremos un arreglo con el nombre “proveedor”
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
.
.
.
],
Estos son algunos de los proveedores de servicios proporcionados junto con laravel, es decir, servicios básicos que se colocan en el contenedor de servicios.
service provider
se realizan?Si miramos la documentación bajo pedido ciclo de vida , los siguientes archivos se ejecutan al inicio:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
y su Middlewares
Service Providers
: contenido de este artículoQue service provider
estan cargados?
ellos son esos definoches en la matriz config/app.php
:
return [
// ... other configuration values
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
// ... other framework providers from /vendor
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* PUBLIC Service Providers - the ones we mentioned above
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
];
Como podemos ver, hay una lista de service provider
no público en la carpeta /vendor
, no debemos tocarlos ni modificarlos. Los que nos interesan están abajo, con BroadcastServicerProvider
deshabilitado por defecto, probablemente porque rara vez se usa.
Todos estos proveedores de servicios van de arriba a abajo, repitiendo la lista dos veces:
register()
, útil para (eventualmente) ejecutar algo configurado antes del método boot()
.boot()
de todos los proveedores. Nuevamente, uno por uno, de arriba a abajo, de la matriz 'providers'
.I Service Providers
incluidos en Laravel, son todos los presentes en la carpeta app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Son todas clases de PHP, cada una relacionada con su propio tema: App
, Auth
, Broadcasting
, Events
e Routes
. Pero todos tienen una cosa en común: método boot()
.
Dentro de ese método, podemos escribir cualquier código relacionado con cualquiera de esas secciones: auth
, events
, route
, etc. En otras palabras, los proveedores de servicios son solo clases para registrar alguna funcionalidad global.
Están separados como "proveedores" porque se ejecutan muy temprano en el ciclo de vida de la aplicación, por lo que algo global es conveniente aquí antes de que el script de ejecución llegue a Modelos o Controladores.
La mayor parte de la funcionalidad está en RouteServiceProvider, aquí está el código:
class RouteServiceProvider extends ServiceProvider
{
public const HOME = '/dashboard';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->group(base_path('routes/api.php'));
Route::middleware('web')
->group(base_path('routes/web.php'));
});
}
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
}
Esta es la clase donde se configuran los archivos. route
, con routes/web.php
e routes/api.php
incluido por defectodefinita. Tenga en cuenta que para la API también hay diferentes configuraciones: Prefijo de punto final /api
y software intermedio api
para todos routes
.
Podemos editar el service providers
, que no están en la carpeta /vendor
. La personalización de estos archivos se realiza cuando tiene muchas rutas y desea separarlas en archivos específicos. Tu creas routes/auth.php
y coloque las rutas allí, luego "habilita" ese archivo en el método boot()
di RouteServiceProvider
, solo agregue la tercera oración:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
esta vacio. Un ejemplo típico de agregar código AppServiceProvider
, se trata de deshabilitar la carga diferida en Eloquent . Para hacer esto, solo necesitas añadir dos líneas en el método boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Esto arrojará una excepción si no se carga un modelo de relación.
service provider
costumbreAdemás de los archivos previosdefinoches, podemos crear uno nuevo fácilmente Service Provider
, relacionados con otros temas distintos a los predefiterminado como auth
/event
/routes
.
Un ejemplo bastante típico es la configuración de vista Blade
. Podemos crear una directiva Blade
y luego agregue ese código en el método boot(
) de cualquier service provider
, incluido el valor predeterminado AppServiceProvider
. Ahora vamos a crear un ViewServiceProvider
separado.
Podemos generarlo con este comando:
php artisan make:provider ViewServiceProvider
Lo que generará la clase tan pre.definoche:
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
Como podemos ver en el interior hay dos métodos:
El método register() nos permite defiFinalice los enlaces a nuestro contenedor de servicios. Por ejemplo, en el siguiente código:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app es una variable global en laravel a la que una clase singleton puede acceder a través de la aplicación.
Singleton es una característica. Al aplicar esta función, le informamos a la aplicación que cualquier clase que se pase como parámetro en la aplicación solo debe tener una instancia en toda la aplicación. Esto significa que MyClass se resolverá una vez y tendrá solo una instancia, a la que se puede acceder mediante la variable my_class.
El método boot() le permite acceder a todos los servicios previamente registrados utilizando el método de registro. Luego puede incluir todo el servicio en su aplicación usando este método.
Volviendo al ejemplo anterior, eliminemos el método register()
y dentro boot()
agregue el código de la directiva Blade:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Otro ejemplo de ViewServiceProvider
saludos View Composers
, aquí está el fragmento del sitio oficial de Laravel :
use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
public function boot()
{
// Using class based composers...
View::composer('profile', ProfileComposer::class);
// Using closure based composers...
View::composer('dashboard', function ($view) {
//
});
}
}
Para ejecutar, este nuevo proveedor debe agregarse/registrarse en la matriz de proveedores config/app.php
:
return [
// ... other configuration values
'providers' => [
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
// Add your provider here
App\Providers\ViewServiceProvider::class,
],
];
Ercole Palmeri
También podrían estar interesados en:
El lunes pasado, el Financial Times anunció un acuerdo con OpenAI. FT otorga licencia para su periodismo de clase mundial...
Millones de personas pagan por servicios de streaming pagando cuotas de suscripción mensuales. Es opinión común que usted…
Coveware by Veeam seguirá brindando servicios de respuesta a incidentes de extorsión cibernética. Coveware ofrecerá capacidades forenses y de remediación...
El mantenimiento predictivo está revolucionando el sector del petróleo y el gas, con un enfoque innovador y proactivo para la gestión de plantas.…