Drugim riječima, serviseri su poput lijevka kroz koji sipamo gorivo "klase" u rezervoar koji se zove "servisni kontejner" motora koji se zove Laravel.
Ako otvorimo config/app.php vidjet ćemo niz sa imenom “provider”
'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,
.
.
.
],
Ovo su neki od provajdera usluga koji se pružaju zajedno sa laravel-om, odnosno osnovnim servisima koji su smešteni u servisni kontejner.
service provider
da li se izvode?Ako pogledamo dokumentaciju na zahtjev životni ciklus , sljedeće datoteke se izvršavaju na početku:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
i njegov Middlewares
Service Providers
: sadržaj ovog člankaKoji service provider
jesu li napunjeni?
Oni su to defikraja u nizu 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,
],
];
Kao što vidimo, postoji lista service provider
nije javno u folderu /vendor
, ne bismo ih trebali dirati niti modificirati. Oni koji nas zanimaju su u nastavku, sa BroadcastServicerProvider
onemogućeno po defaultu, vjerovatno zato što se rijetko koristi.
Svi ovi provajderi se kreću od vrha do dna, ponavljajući listu dvaput:
register()
, korisno za (eventualno) izvršavanje nečega konfiguriranog prije metode boot()
.boot()
svih provajdera. Opet, jedan po jedan, od vrha do dna, niza 'providers'
.I Service Providers
uključeni u Laravel, da li su svi oni prisutni u folderu app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Sve su to PHP klase, svaka povezana sa svojom temom: App
, Auth
, Broadcasting
, Events
e Routes
. Ali svi imaju jednu zajedničku stvar: metod boot()
.
Unutar te metode možemo napisati bilo koji kod povezan sa bilo kojim od tih odjeljaka: auth
, events
, route
, itd. Drugim riječima, dobavljači usluga su samo klase za registraciju neke globalne funkcionalnosti.
Oni su odvojeni kao "provajderi" jer se pokreću veoma rano u životnom ciklusu aplikacije, tako da je nešto globalno ovde zgodno pre nego što izvršna skripta dođe do modela ili kontrolera.
Većina funkcionalnosti je u RouteServiceProvideru, evo koda:
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());
});
}
}
Ovo je klasa u kojoj su fajlovi konfigurisani route
sa routes/web.php
e routes/api.php
uključeno po defaultudefinita. Imajte na umu da za API postoje i različite konfiguracije: Prefiks krajnje tačke /api
i srednji softver api
za sve routes
.
Možemo uređivati service providers
, koji se ne nalaze u folderu /vendor
. Prilagođavanje ovih datoteka se vrši kada imate mnogo putanja i želite ih razdvojiti u određene datoteke. Vi kreirate routes/auth.php
i stavite putanje tamo, onda "omogućite" tu datoteku u metodi boot()
di RouteServiceProvider
, samo dodajte treću rečenicu:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
prazan je. Tipičan primjer dodavanja koda AppServiceProvider
, odnosi se na onemogućavanje lijenog učitavanja u Eloquentu. Da biste to uradili, samo trebate dodajte dva reda u metodi boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Ovo će izazvati izuzetak ako model odnosa nije učitan.
service provider
prilagođenaPored pred fajlovadefina kraju, lako možemo kreirati novu Service Provider
, vezano za druge teme osim onih predefizavršio kao auth
/event
/routes
.
Prilično tipičan primjer je konfiguracija pogleda Blade
. Možemo kreirati direktivu Blade
, a zatim dodajte taj kod u metodu boot(
) bilo kojeg service provider
, uključujući zadanu AppServiceProvider
. Kreirajmo sada a ViewServiceProvider
odvojeno.
Možemo ga generirati ovom naredbom:
php artisan make:provider ViewServiceProvider
Koji će generirati klasu tako predefinavečer:
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()
{
//
}
}
Kao što vidimo unutra postoje dvije metode:
Metoda register() nam to omogućava defiviše linkova do našeg servisnog kontejnera. Na primjer, u sljedećem kodu:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
$this->app je globalna varijabla u laravel-u kojoj singleton klasa može pristupiti kroz aplikaciju.
Singleton je karakteristika. Kada primjenjujemo ovu funkciju, obavještavamo aplikaciju da bilo koja klasa koja se prosljeđuje kao parametar u aplikaciji treba imati samo jednu instancu u cijeloj aplikaciji. To znači da će MyClass biti razriješen jednom i da će imati samo jednu instancu kojoj se može pristupiti pomoću varijable my_class.
Metoda boot() vam omogućava da pristupite svim uslugama koje su prethodno registrovane pomoću metode registracije. Zatim možete uključiti cijelu uslugu u svoju aplikaciju koristeći ovu metodu.
Vraćajući se na prethodni primjer, uklonimo metodu register()
i unutar boot()
dodajte kod Blade direktive:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Još jedan primjer ViewServiceProvider
obzir View Composers
, evo isječka sa službene Laravel stranice :
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) {
//
});
}
}
Da bi se pokrenuo, ovaj novi provajder mora biti dodan/registriran u nizu provajdera 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
Možda će vas zanimati i:
UK CMA izdao je upozorenje o ponašanju Big Tech-a na tržištu umjetne inteligencije. Tamo…
Uredba o „zelenim kućama“, koju je formulisala Evropska unija za poboljšanje energetske efikasnosti zgrada, završila je svoj zakonodavni proces sa…
Predstavljen godišnji izvještaj Casaleggio Associati o e-trgovini u Italiji. Izvještaj pod nazivom “AI-Commerce: granice e-trgovine s umjetnom inteligencijom”.…
Rezultat stalnih tehnoloških inovacija i posvećenosti životnoj sredini i dobrobiti ljudi. Bandalux predstavlja Airpure®, šator…