Με άλλα λόγια, οι πάροχοι υπηρεσιών είναι σαν μια χοάνη μέσω της οποίας ρίχνουμε καύσιμο «κατηγορίας» σε μια δεξαμενή που ονομάζεται «κοντέινερ εξυπηρέτησης» ενός κινητήρα που ονομάζεται Laravel.
Αν ανοίξουμε config/app.php θα δούμε έναν πίνακα με το όνομα "πάροχος"
'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,
.
.
.
],
Αυτοί είναι μερικοί από τους παρόχους υπηρεσιών που παρέχονται μαζί με τη laravel, δηλαδή βασικές υπηρεσίες που τοποθετούνται στο κοντέινερ υπηρεσιών.
service provider
εκτελούνται;Αν δούμε την τεκμηρίωση κατόπιν αιτήματος κύκλου ζωής , τα ακόλουθα αρχεία εκτελούνται στην αρχή:
public/index.php
bootstrap/app.php
app/Http/Kernel.php
και το δικό του Middlewares
Service Providers
: περιεχόμενο αυτού του άρθρουτι service provider
είναι φορτωμένα;
Αυτοί είναι definites στη συστοιχία 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,
],
];
Όπως μπορούμε να δούμε, υπάρχει μια λίστα με service provider
δεν είναι δημόσιο στο φάκελο /vendor
, δεν πρέπει ούτε να τα αγγίζουμε ούτε να τα τροποποιούμε. Αυτά που μας ενδιαφέρουν είναι παρακάτω, με BroadcastServicerProvider
απενεργοποιημένο από προεπιλογή, πιθανώς επειδή χρησιμοποιείται σπάνια.
Όλοι αυτοί οι πάροχοι υπηρεσιών τρέχουν από πάνω προς τα κάτω, επαναλαμβάνοντας τη λίστα δύο φορές:
register()
, χρήσιμο για (τελικά) εκτέλεση κάτι που έχει ρυθμιστεί πριν από τη μέθοδο boot()
.boot()
όλων των παρόχων. Και πάλι, ένα προς ένα, από πάνω προς τα κάτω, του πίνακα 'providers'
.I Service Providers
περιλαμβάνονται στο Laravel, είναι όλα όσα υπάρχουν στο φάκελο app/Providers
:
AppServiceProvider
AuthServiceProvider
BroadcastServiceProvider
EventServiceProvider
RouteServiceProvider
Είναι όλες κλάσεις PHP, η καθεμία σχετίζεται με το δικό της θέμα: App
, Auth
, Broadcasting
, Events
e Routes
. Όλοι όμως έχουν ένα κοινό χαρακτηριστικό: τη μέθοδο boot()
.
Μέσα σε αυτήν τη μέθοδο, μπορούμε να γράψουμε οποιονδήποτε κώδικα που σχετίζεται με οποιαδήποτε από αυτές τις ενότητες: auth
, events
, route
, και τα λοιπά. Με άλλα λόγια, οι πάροχοι υπηρεσιών είναι απλώς κλάσεις για την καταχώριση ορισμένων καθολικών λειτουργιών.
Είναι ξεχωριστοί ως "πάροχοι" επειδή εκτελούνται πολύ νωρίς στον κύκλο ζωής της εφαρμογής, επομένως κάτι παγκόσμιο είναι βολικό εδώ πριν το σενάριο εκτέλεσης φτάσει στα Μοντέλα ή τους Ελεγκτές.
Το μεγαλύτερο μέρος της λειτουργικότητας βρίσκεται στον RouteServiceProvider, εδώ είναι ο κώδικας:
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());
});
}
}
Αυτή είναι η κλάση όπου διαμορφώνονται τα αρχεία route
, Με routes/web.php
e routes/api.php
περιλαμβάνονται από προεπιλογήdefiνίτα. Σημειώστε ότι για το API υπάρχουν επίσης διαφορετικές διαμορφώσεις: Πρόθεμα Endpoint /api
και ενδιάμεσο λογισμικό api
για όλους routes
.
Μπορούμε να επεξεργαστούμε το service providers
, τα οποία δεν βρίσκονται στον φάκελο /vendor
. Η προσαρμογή αυτών των αρχείων γίνεται όταν έχετε πολλές διαδρομές και θέλετε να τις διαχωρίσετε σε συγκεκριμένα αρχεία. Δημιουργείς routes/auth.php
και βάλτε τις διαδρομές εκεί και μετά "ενεργοποιείτε" αυτό το αρχείο στη μέθοδο boot()
di RouteServiceProvider
, απλά προσθέστε την τρίτη πρόταση:
`Route::middleware('web') // or maybe you want another middleware?
->group(base_path('routes/auth.php'));
AppServiceProvider
είναι άδειο. Χαρακτηριστικό παράδειγμα προσθήκης κώδικα AppServiceProvider
, αφορά την απενεργοποίηση της τεμπέλης φόρτωσης στο Eloquent . Για να το κάνετε αυτό, χρειάζεστε μόνο προσθέστε δύο γραμμές στη μέθοδο boot()
:
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
public function boot()
{
Model::preventLazyLoading(! $this->app->isProduction());
}
Αυτό θα δημιουργήσει μια εξαίρεση εάν δεν φορτωθεί ένα μοντέλο σχέσης.
service provider
προσαρμοσμένεςΕκτός από τα αρχεία προdefinites, μπορούμε εύκολα να δημιουργήσουμε ένα νέο Service Provider
, που σχετίζονται με άλλα θέματα από εκείνα προdefiτελείωσε ως auth
/event
/routes
.
Ένα αρκετά χαρακτηριστικό παράδειγμα είναι η διαμόρφωση προβολής Blade
. Μπορούμε να δημιουργήσουμε μια οδηγία Blade
και, στη συνέχεια, προσθέστε αυτόν τον κώδικα στη μέθοδο boot(
) οποιουδήποτε service provider
, συμπεριλαμβανομένης της προεπιλογής AppServiceProvider
. Ας δημιουργήσουμε τώρα ένα ViewServiceProvider
ξεχωριστός.
Μπορούμε να το δημιουργήσουμε με αυτήν την εντολή:
php artisan make:provider ViewServiceProvider
Που θα δημιουργήσει την τάξη τόσο προdefinite:
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()
{
//
}
}
Όπως μπορούμε να δούμε στο εσωτερικό υπάρχουν δύο μέθοδοι:
Η μέθοδος register() μας επιτρέπει definish συνδέσμους στο κοντέινερ υπηρεσιών μας. Για παράδειγμα, στον παρακάτω κώδικα:
public function register()
{
$this->app->singleton(my_class, function($app){
return new MyClass($app);
});
}
Η $this->app είναι μια καθολική μεταβλητή στο laravel στην οποία μια κλάση singleton μπορεί να έχει πρόσβαση μέσω της εφαρμογής.
Το Singleton είναι ένα χαρακτηριστικό. Κατά την εφαρμογή αυτής της δυνατότητας, ενημερώνουμε την εφαρμογή ότι οποιαδήποτε κλάση μεταβιβάζεται ως παράμετρος στην εφαρμογή θα πρέπει να έχει μόνο μία παρουσία σε ολόκληρη την εφαρμογή. Αυτό σημαίνει ότι το MyClass θα επιλυθεί μία φορά και θα έχει μόνο ένα στιγμιότυπο, το οποίο μπορεί να προσπελαστεί χρησιμοποιώντας τη μεταβλητή my_class.
Η μέθοδος boot() σάς επιτρέπει να έχετε πρόσβαση σε όλες τις υπηρεσίες που είχαν καταχωριστεί προηγουμένως χρησιμοποιώντας τη μέθοδο εγγραφής. Στη συνέχεια, μπορείτε να συμπεριλάβετε ολόκληρη την υπηρεσία στην εφαρμογή σας χρησιμοποιώντας αυτήν τη μέθοδο.
Επιστρέφοντας στο προηγούμενο παράδειγμα, ας αφαιρέσουμε τη μέθοδο register()
και εντός boot()
προσθέστε τον κωδικό της οδηγίας Blade:
use Illuminate\Support\Facades\Blade;
public function boot()
{
Blade::directive('datetime', function ($expression) {
return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
});
}
Ένα άλλο παράδειγμα του ViewServiceProvider
αφορά View Composers
, εδώ είναι το απόσπασμα από το επίσημο site της 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) {
//
});
}
}
Για να εκτελεστεί, αυτός ο νέος πάροχος πρέπει να προστεθεί/εγγραφεί στον πίνακα παροχέα 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
Μπορεί επίσης να σας ενδιαφέρει:
Την περασμένη Δευτέρα, οι Financial Times ανακοίνωσαν συμφωνία με το OpenAI. Η FT αδειοδοτεί την παγκόσμιας κλάσης δημοσιογραφία της…
Εκατομμύρια άνθρωποι πληρώνουν για υπηρεσίες ροής, πληρώνοντας μηνιαίες συνδρομές. Είναι κοινή γνώμη ότι…
Η Coveware από την Veeam θα συνεχίσει να παρέχει υπηρεσίες αντιμετώπισης περιστατικών εκβιασμών στον κυβερνοχώρο. Το Coveware θα προσφέρει ιατροδικαστικές και δυνατότητες αποκατάστασης…
Η προγνωστική συντήρηση φέρνει επανάσταση στον τομέα του πετρελαίου και του φυσικού αερίου, με μια καινοτόμο και προορατική προσέγγιση στη διαχείριση των εγκαταστάσεων.…