εμπορεύματα

Πάροχοι υπηρεσιών στο Laravel: τι είναι και πώς να χρησιμοποιήσετε τους παρόχους υπηρεσιών στο Laravel

Οι πάροχοι υπηρεσιών Laravel είναι το κεντρικό μέρος όπου ξεκινά η εφαρμογή. Δηλαδή, οι βασικές υπηρεσίες laravel και οι υπηρεσίες εφαρμογών, οι κλάσεις και οι εξαρτήσεις τους προωθούνται στο κοντέινερ υπηρεσιών μέσω παρόχων. 

Με άλλα λόγια, οι πάροχοι υπηρεσιών είναι σαν μια χοάνη μέσω της οποίας ρίχνουμε καύσιμο «κατηγορίας» σε μια δεξαμενή που ονομάζεται «κοντέινερ εξυπηρέτησης» ενός κινητήρα που ονομάζεται 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'.
  • Τέλος, αφού ολοκληρωθεί η επεξεργασία όλων των παρόχων υπηρεσιών, η Laravel προχωρά στην ανάλυση της διαδρομής (διαδρομή), στην εκτέλεση του ελεγκτή, στη χρήση προτύπων κ.λπ.

Πάροχοι υπηρεσιών Laravel predefiνίτι

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.phproutes/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():

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.
// 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().

Η μέθοδος 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().

Η μέθοδος 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

Μπορεί επίσης να σας ενδιαφέρει:

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.

Πρόσφατα άρθρα

Οι εκδότες και το OpenAI υπογράφουν συμφωνίες για τη ρύθμιση της ροής πληροφοριών που επεξεργάζεται η τεχνητή νοημοσύνη

Την περασμένη Δευτέρα, οι Financial Times ανακοίνωσαν συμφωνία με το OpenAI. Η FT αδειοδοτεί την παγκόσμιας κλάσης δημοσιογραφία της…

Απρίλιος 30 2024

Ηλεκτρονικές πληρωμές: Δείτε πώς οι υπηρεσίες ροής σας κάνουν να πληρώνετε για πάντα

Εκατομμύρια άνθρωποι πληρώνουν για υπηρεσίες ροής, πληρώνοντας μηνιαίες συνδρομές. Είναι κοινή γνώμη ότι…

Απρίλιος 29 2024

Το Veeam διαθέτει την πιο ολοκληρωμένη υποστήριξη για ransomware, από προστασία έως απόκριση και ανάκτηση

Η Coveware από την Veeam θα συνεχίσει να παρέχει υπηρεσίες αντιμετώπισης περιστατικών εκβιασμών στον κυβερνοχώρο. Το Coveware θα προσφέρει ιατροδικαστικές και δυνατότητες αποκατάστασης…

Απρίλιος 23 2024

Πράσινη και ψηφιακή επανάσταση: Πώς η προβλεπτική συντήρηση μεταμορφώνει τη βιομηχανία πετρελαίου και φυσικού αερίου

Η προγνωστική συντήρηση φέρνει επανάσταση στον τομέα του πετρελαίου και του φυσικού αερίου, με μια καινοτόμο και προορατική προσέγγιση στη διαχείριση των εγκαταστάσεων.…

Απρίλιος 22 2024

Διαβάστε την Καινοτομία στη γλώσσα σας

Ενημερωτικό δελτίο καινοτομίας
Μην χάσετε τα πιο σημαντικά νέα για την καινοτομία. Εγγραφείτε για να τα λάβετε μέσω email.

Seguici