ບົດຄວາມ

ຜູ້ໃຫ້ບໍລິການໃນ Laravel: ພວກເຂົາແມ່ນຫຍັງແລະວິທີການນໍາໃຊ້ຜູ້ໃຫ້ບໍລິການໃນ Laravel

ຜູ້ໃຫ້ບໍລິການ Laravel ແມ່ນຈຸດໃຈກາງທີ່ແອັບພລິເຄຊັນເລີ່ມຕົ້ນ. ນັ້ນແມ່ນ, ການບໍລິການ Laravel ຫຼັກແລະການບໍລິການຄໍາຮ້ອງສະຫມັກ, ຫ້ອງຮຽນ, ແລະການເພິ່ງພາອາໄສຂອງພວກເຂົາຖືກຈັດໃສ່ໃນຕູ້ບໍລິການຜ່ານຜູ້ໃຫ້ບໍລິການ. 

ໃນຄໍາສັບຕ່າງໆອື່ນໆ, ຜູ້ໃຫ້ບໍລິການແມ່ນຄ້າຍຄືຊ່ອງທາງທີ່ພວກເຮົາເອົາ "ຫ້ອງຮຽນ" ນໍ້າມັນເຊື້ອໄຟເຂົ້າໄປໃນຖັງທີ່ເອີ້ນວ່າ "ຕູ້ບໍລິການ" ຂອງເຄື່ອງຈັກທີ່ເອີ້ນວ່າ Laravel.

ຍົກຕົວຢ່າງ

ຖ້າພວກເຮົາເປີດ config/app.php ພວກເຮົາຈະເຫັນ array ທີ່ມີຊື່ "ຜູ້ໃຫ້ບໍລິການ"

'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, i.e. ການບໍລິການພື້ນຖານທີ່ວາງໄວ້ໃນຖັງບໍລິການ.

ເມື່ອ​ຂ້ອຍ service provider ພວກເຂົາເຈົ້າໄດ້ຖືກປະຕິບັດ?

ຖ້າພວກເຮົາເບິ່ງເອກະສານ ຕາມ​ການ​ຮ້ອງ​ຂໍ​ວົງ​ຈອນ​ຊີ​ວິດ​ , ໄຟລ໌ຕໍ່ໄປນີ້ຖືກປະຕິບັດໃນຕອນເລີ່ມຕົ້ນ:

  • public/index.php
  • bootstrap/app.php
  • app/Http/Kernel.php ແລະລາວ Middlewares
  • Service Providers: ເນື້ອໃນຂອງບົດຄວາມນີ້

ເຊິ່ງ service provider ເຂົາເຈົ້າໂຫຼດແລ້ວບໍ? 

ເຫຼົ່ານັ້ນ definited ໃນ array ໄດ້ 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 ປິດການໃຊ້ງານໂດຍຄ່າເລີ່ມຕົ້ນ, ອາດຈະເປັນຍ້ອນວ່າມັນບໍ່ຄ່ອຍໄດ້ໃຊ້.

ຜູ້ໃຫ້ບໍລິການທັງຫມົດເຫຼົ່ານີ້ດໍາເນີນການຈາກເທິງຫາລຸ່ມ, ຊ້ໍາບັນຊີລາຍຊື່ ສອງເທື່ອ:

  • iteration ທໍາອິດກໍາລັງຊອກຫາວິທີການທາງເລືອກ register(), ເປັນປະໂຫຍດສໍາລັບການປະຕິບັດ (ອາດຈະເປັນ) ບາງສິ່ງບາງຢ່າງທີ່ກໍາຫນົດຄ່າກ່ອນວິທີການ boot().
  • ການ iteration ທີສອງປະຕິບັດວິທີການ boot() ຂອງຜູ້ໃຫ້ບໍລິການທັງຫມົດ. ອີກເທື່ອຫນຶ່ງ, ຫນຶ່ງໂດຍຫນຶ່ງ, ຈາກເທິງຫາລຸ່ມສຸດ, ຂອງ array 'providers'.
  • ສຸດທ້າຍ, ຫຼັງຈາກຜູ້ໃຫ້ບໍລິການທັງຫມົດຖືກປຸງແຕ່ງ, Laravel ກ້າວໄປສູ່ການວິເຄາະເສັ້ນທາງ (ເສັ້ນທາງ), ການປະຕິບັດຕົວຄວບຄຸມ, ການນໍາໃຊ້ຕົວແບບ, ແລະອື່ນໆ.

ຜູ້ໃຫ້ບໍລິການ Laravel predefiniti

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 prefix /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, ແມ່ນກ່ຽວກັບການປິດການໂຫຼດ lazy ໃນ Eloquent. ເພື່ອເຮັດສິ່ງນີ້, ທ່ານພຽງແຕ່ຕ້ອງການ ເພີ່ມສອງແຖວ ໃນ​ວິ​ທີ​ການ​ boot():

ຈົດໝາຍຂ່າວປະດິດສ້າງ
ຢ່າພາດຂ່າວທີ່ສໍາຄັນທີ່ສຸດກ່ຽວກັບການປະດິດສ້າງ. ລົງທະບຽນເພື່ອຮັບພວກມັນທາງອີເມວ.
// app/Providers/AppServiceProvider.php
use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

ນີ້ຈະຖິ້ມຂໍ້ຍົກເວັ້ນຖ້າແມ່ແບບຄວາມສໍາພັນບໍ່ໄດ້ຖືກໂຫລດ.

ສ້າງຂອງຕົນເອງ service provider ລູກຄ້າ

ນອກເຫນືອໄປຈາກກ່ອນdefinited ທີ່ມີຢູ່ແລ້ວ, ພວກເຮົາສາມາດສ້າງໃຫມ່ໄດ້ຢ່າງງ່າຍດາຍ Service Provider, ກ່ຽວຂ້ອງກັບຫົວຂໍ້ອື່ນໆກ່ວາຫົວຂໍ້ທີ່ຜ່ານມາdefiຈະແຈ້ງເປັນ auth/event/routes.

ຕົວຢ່າງທີ່ຂ້ອນຂ້າງປົກກະຕິແມ່ນການຕັ້ງຄ່າທີ່ກ່ຽວຂ້ອງກັບການເບິ່ງ Blade. ພວກເຮົາສາມາດສ້າງຄໍາສັ່ງ Blade, ແລະຫຼັງຈາກນັ້ນຕື່ມລະຫັດນັ້ນເຂົ້າໄປໃນວິທີການ boot() ຂອງໃດໆ service provider, ລວມທັງຄ່າເລີ່ມຕົ້ນ AppServiceProvider. ຕອນນີ້ໃຫ້ສ້າງ a ViewServiceProvider ແຍກ.

ພວກເຮົາສາມາດສ້າງມັນດ້ວຍຄໍາສັ່ງນີ້:

php artisan make:provider ViewServiceProvider

ເຊິ່ງຈະສ້າງຊັ້ນຮຽນກ່ອນdefiກາງຄືນ:

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()
    {
        //
    }
}

ດັ່ງທີ່ພວກເຮົາເຫັນພາຍໃນມີສອງວິທີ:

ວິທີການລົງທະບຽນ ().

ວິທີການລົງທະບຽນ () ອະນຸຍາດໃຫ້ພວກເຮົາ definish ການເຊື່ອມຕໍ່ກັບຖັງບໍລິການຂອງພວກເຮົາ. ຕົວຢ່າງ, ໃນລະຫັດຕໍ່ໄປນີ້:

public function register()
{
    $this->app->singleton(my_class, function($app){
        return new MyClass($app);
    });
}

$this->app ແມ່ນຕົວແປທົ່ວໂລກໃນ laravel ທີ່ສາມາດເຂົ້າເຖິງຫ້ອງຮຽນ singleton ຜ່ານແອັບ.

Singleton ແມ່ນລັກສະນະ. ໃນ​ເວ​ລາ​ທີ່​ການ​ນໍາ​ໃຊ້​ຄຸນ​ສົມ​ບັດ​ນີ້​, ພວກ​ເຮົາ​ກໍາ​ລັງ​ແຈ້ງ​ໃຫ້​ກັບ​ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​ວ່າ​ຊັ້ນ​ໃດ​ກໍ​ຕາມ​ທີ່​ຖືກ​ຜ່ານ​ເປັນ​ພາ​ລາ​ມິ​ເຕີ​ໃນ app ຄວນ​ຈະ​ມີ​ພຽງ​ແຕ່​ຫນຶ່ງ​ໃນ​ຄໍາ​ຮ້ອງ​ສະ​ຫມັກ​ທັງ​ຫມົດ​. ນີ້ຫມາຍຄວາມວ່າ 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, ນີ້ແມ່ນ snippet ໄດ້ ຈາກເວັບໄຊທ໌ທາງການ 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) {
            //
        });
    }
}

ເພື່ອດໍາເນີນການ, ຜູ້ໃຫ້ບໍລິການໃຫມ່ນີ້ຕ້ອງໄດ້ຮັບການເພີ່ມ / ລົງທະບຽນກັບ array ຜູ້ໃຫ້ບໍລິການ 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

ທ່ານອາດຈະສົນໃຈໃນ:

ຈົດໝາຍຂ່າວປະດິດສ້າງ
ຢ່າພາດຂ່າວທີ່ສໍາຄັນທີ່ສຸດກ່ຽວກັບການປະດິດສ້າງ. ລົງທະບຽນເພື່ອຮັບພວກມັນທາງອີເມວ.

Recent articles

Publishers ແລະ OpenAI ລົງນາມໃນຂໍ້ຕົກລົງເພື່ອຄວບຄຸມການໄຫຼເຂົ້າຂອງຂໍ້ມູນທີ່ປຸງແຕ່ງໂດຍ Artificial Intelligence

ວັນຈັນທີ່ຜ່ານມາ, Financial Times ໄດ້ປະກາດຂໍ້ຕົກລົງກັບ OpenAI. FT ອະນຸຍາດໃຫ້ນັກຂ່າວລະດັບໂລກຂອງຕົນ…

30 April 2024

ການຈ່າຍເງິນອອນໄລນ໌: ນີ້ແມ່ນວິທີທີ່ບໍລິການສະຕຣີມເຮັດໃຫ້ເຈົ້າຈ່າຍເງິນຕະຫຼອດໄປ

ຫລາຍລ້ານຄົນຈ່າຍຄ່າບໍລິການສະຕີມ, ຈ່າຍຄ່າທໍານຽມການສະຫມັກປະຈໍາເດືອນ. ມັນ​ເປັນ​ຄວາມ​ຄິດ​ເຫັນ​ທົ່ວ​ໄປ​ທີ່​ທ່ານ…

29 April 2024

Veeam ມີລັກສະນະສະຫນັບສະຫນູນທີ່ສົມບູນແບບທີ່ສຸດສໍາລັບ ransomware, ຈາກການປົກປ້ອງເຖິງການຕອບສະຫນອງແລະການຟື້ນຕົວ

Coveware ໂດຍ Veeam ຈະສືບຕໍ່ໃຫ້ບໍລິການຕອບໂຕ້ເຫດການ extortion cyber. Coveware ຈະສະ ເໜີ ຄວາມສາມາດດ້ານນິຕິສາດແລະການແກ້ໄຂ…

23 April 2024

ການປະຕິວັດສີຂຽວ ແລະ ດິຈິຕອລ: ວິທີການຮັກສາການຄາດເດົາແມ່ນການຫັນປ່ຽນອຸດສາຫະກຳນ້ຳມັນ ແລະອາຍແກັສ

ການຮັກສາການຄາດເດົາແມ່ນການປະຕິວັດຂະແໜງນ້ຳມັນ ແລະ ອາຍແກັສ, ດ້ວຍແນວທາງນະວັດຕະກໍາ ແລະ ຕັ້ງໜ້າໃນການຄຸ້ມຄອງພືດ.…

22 April 2024

ອ່ານນະວັດຕະກໍາໃນພາສາຂອງເຈົ້າ

ຈົດໝາຍຂ່າວປະດິດສ້າງ
ຢ່າພາດຂ່າວທີ່ສໍາຄັນທີ່ສຸດກ່ຽວກັບການປະດິດສ້າງ. ລົງທະບຽນເພື່ອຮັບພວກມັນທາງອີເມວ.

ປະຕິບັດຕາມພວກເຮົາ