Maison > cadre php > Laravel > Explication détaillée des contrats et des façades dans Laravel

Explication détaillée des contrats et des façades dans Laravel

藏色散人
Libérer: 2020-04-15 13:42:46
avant
3548 Les gens l'ont consulté

Contracts

Contracts préconise en fait une programmation orientée interface pour atteindre l'objectif de découplage. Ces interfaces communes ont été conçues pour vous par Laravel. Ce sont des contrats.

Alors, comment Laravel sait-il quelle implémentation nous devons utiliser ?

Dans la liaison Contracts par défaut de Laravel, il y a cette définition dans 'Illuminate/Foundation/Application.php' : Il s'agit de la liaison de l'implémentation de l'interface par défaut.

Recommandé : "Laravel Tutoriel

/**
     * Register the core class aliases in the container.
     *
     * @return void
     */
    public function registerCoreContainerAliases()
    {
        $aliases = [
            'app'                  => ['Illuminate\Foundation\Application', 'Illuminate\Contracts\Container\Container', 'Illuminate\Contracts\Foundation\Application'],
            'auth'                 => 'Illuminate\Auth\AuthManager',
            'auth.driver'          => ['Illuminate\Auth\Guard', 'Illuminate\Contracts\Auth\Guard'],
            'auth.password.tokens' => 'Illuminate\Auth\Passwords\TokenRepositoryInterface',
            'blade.compiler'       => 'Illuminate\View\Compilers\BladeCompiler',
            'cache'                => ['Illuminate\Cache\CacheManager', 'Illuminate\Contracts\Cache\Factory'],
            'cache.store'          => ['Illuminate\Cache\Repository', 'Illuminate\Contracts\Cache\Repository'],
            'config'               => ['Illuminate\Config\Repository', 'Illuminate\Contracts\Config\Repository'],
            'cookie'               => ['Illuminate\Cookie\CookieJar', 'Illuminate\Contracts\Cookie\Factory', 'Illuminate\Contracts\Cookie\QueueingFactory'],
            'encrypter'            => ['Illuminate\Encryption\Encrypter', 'Illuminate\Contracts\Encryption\Encrypter'],
            'db'                   => 'Illuminate\Database\DatabaseManager',
            'db.connection'        => ['Illuminate\Database\Connection', 'Illuminate\Database\ConnectionInterface'],
            'events'               => ['Illuminate\Events\Dispatcher', 'Illuminate\Contracts\Events\Dispatcher'],
            'files'                => 'Illuminate\Filesystem\Filesystem',
            'filesystem'           => ['Illuminate\Filesystem\FilesystemManager', 'Illuminate\Contracts\Filesystem\Factory'],
            'filesystem.disk'      => 'Illuminate\Contracts\Filesystem\Filesystem',
            'filesystem.cloud'     => 'Illuminate\Contracts\Filesystem\Cloud',
            'hash'                 => 'Illuminate\Contracts\Hashing\Hasher',
            'translator'           => ['Illuminate\Translation\Translator', 'Symfony\Component\Translation\TranslatorInterface'],
            'log'                  => ['Illuminate\Log\Writer', 'Illuminate\Contracts\Logging\Log', 'Psr\Log\LoggerInterface'],
            'mailer'               => ['Illuminate\Mail\Mailer', 'Illuminate\Contracts\Mail\Mailer', 'Illuminate\Contracts\Mail\MailQueue'],
            'auth.password'        => ['Illuminate\Auth\Passwords\PasswordBroker', 'Illuminate\Contracts\Auth\PasswordBroker'],
            'queue'                => ['Illuminate\Queue\QueueManager', 'Illuminate\Contracts\Queue\Factory', 'Illuminate\Contracts\Queue\Monitor'],
            'queue.connection'     => 'Illuminate\Contracts\Queue\Queue',
            'redirect'             => 'Illuminate\Routing\Redirector',
            'redis'                => ['Illuminate\Redis\Database', 'Illuminate\Contracts\Redis\Database'],
            'request'              => 'Illuminate\Http\Request',
            'router'               => ['Illuminate\Routing\Router', 'Illuminate\Contracts\Routing\Registrar'],
            'session'              => 'Illuminate\Session\SessionManager',
            'session.store'        => ['Illuminate\Session\Store', 'Symfony\Component\HttpFoundation\Session\SessionInterface'],
            'url'                  => ['Illuminate\Routing\UrlGenerator', 'Illuminate\Contracts\Routing\UrlGenerator'],
            'validator'            => ['Illuminate\Validation\Factory', 'Illuminate\Contracts\Validation\Factory'],
            'view'                 => ['Illuminate\View\Factory', 'Illuminate\Contracts\View\Factory'],
        ];
Copier après la connexion

Lors de l'implémentation de notre interface personnalisée, nous pouvons l'utiliser dans ServiceProvider pour la liaison :

$this->app->bind('App\Contracts\EventPusher', 'App\Services\PusherEventPusher');
Copier après la connexion

Façades

Les façades fournissent un Interface "statique" vers les classes disponibles dans le conteneur de services de l'application. Les « façades » Laravel agissent comme des « proxys statiques » pour les classes de base au sein du conteneur de services. Difficile à comprendre ?

Nous ouvrons config/app.php dans le répertoire du projet, puis trouvons

/*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */
    'aliases' => [
        'App'       => Illuminate\Support\Facades\App::class,
        'Artisan'   => Illuminate\Support\Facades\Artisan::class,
        'Auth'      => Illuminate\Support\Facades\Auth::class,
        'Blade'     => Illuminate\Support\Facades\Blade::class,
        'Bus'       => Illuminate\Support\Facades\Bus::class,
        'Cache'     => Illuminate\Support\Facades\Cache::class,
        'Config'    => Illuminate\Support\Facades\Config::class,
        'Cookie'    => Illuminate\Support\Facades\Cookie::class,
        'Crypt'     => Illuminate\Support\Facades\Crypt::class,
        'DB'        => Illuminate\Support\Facades\DB::class,
        'Eloquent'  => Illuminate\Database\Eloquent\Model::class,
        'Event'     => Illuminate\Support\Facades\Event::class,
        'File'      => Illuminate\Support\Facades\File::class,
        'Gate'      => Illuminate\Support\Facades\Gate::class,
        'Hash'      => Illuminate\Support\Facades\Hash::class,
        'Input'     => Illuminate\Support\Facades\Input::class,
        'Lang'      => Illuminate\Support\Facades\Lang::class,
        'Log'       => Illuminate\Support\Facades\Log::class,
        'Mail'      => Illuminate\Support\Facades\Mail::class,
        'Password'  => Illuminate\Support\Facades\Password::class,
        'Queue'     => Illuminate\Support\Facades\Queue::class,
        'Redirect'  => Illuminate\Support\Facades\Redirect::class,
        'Redis'     => Illuminate\Support\Facades\Redis::class,
        'Request'   => Illuminate\Support\Facades\Request::class,
        'Response'  => Illuminate\Support\Facades\Response::class,
        'Route'     => Illuminate\Support\Facades\Route::class,
        'Schema'    => Illuminate\Support\Facades\Schema::class,
        'Session'   => Illuminate\Support\Facades\Session::class,
        'Storage'   => Illuminate\Support\Facades\Storage::class,
        'URL'       => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View'      => Illuminate\Support\Facades\View::class,
    ],
Copier après la connexion

Avez-vous trouvé quelque chose ? Oui, les façades sont en fait des alias pour une série de classes définies dans config/app.php. C'est juste que ces classes ont toutes une fonctionnalité commune, qui est d'hériter de la classe de base IlluminateSupportFacadesFacade et d'implémenter une méthode : getFacadeAccessor renvoie le nom.

Façade personnalisée

Référence http://www.tutorialspoint.com/laravel/laravel_facades.htm

Étape 1 −Créez un ServiceProvider nommé TestFacadesServiceProvider, utilisez la commande suivante :

php artisan make:provider TestFacadesServiceProvider

Étape 2 − Créez une classe proxy sous-jacente et nommez-la Créer une façade classe appelée « TestFacades.php » pour « TestFacades.php » dans « App/Test ». php » dans « App/Test/Facades ».

App/Test/Facades/TestFacades.php

<?php
namespace App\Test;
class TestFacades{
   public function testingFacades(){
      echo "Testing the Facades in Laravel.";
   }
}
?>
Copier après la connexion

Étape 4 −Créez une classe ServiceProviders nommée « TestFacadesServiceProviders.php » dans « App/Test/Facades ».

App/Providers/TestFacadesServiceProviders.php

<?php
namespace app\Test\Facades;
use Illuminate\Support\Facades\Facade;
class TestFacades extends Facade{
   protected static function getFacadeAccessor() { return &#39;test&#39;; }
}
Copier après la connexion

Étape 5 − Enregistrez ServiceProvider dans la classe config/app.php

Étape 6

− Enregistrez l'alias de façade personnalisé dans config/app.php Test d'utilisation :

Ajoutez les lignes suivantes dans app/ Http/routes.php.

<?php
namespace App\Providers;
use App;
use Illuminate\Support\ServiceProvider;
class TestFacadesServiceProvider extends ServiceProvider {
   public function boot() {
      //
   }
   public function register() {
     //可以这么绑定,这需要use App;
    //  App::bind(&#39;test&#39;,function() {
    //     return new \App\Test\TestFacades;
    //  });
     
     //也可以这么绑定,推荐。这个test对应于Facade的getFacadeAccessor返回值
        $this->app->bind("test", function(){
            return new MyFoo(); //给这个Facade返回一个代理实例。所有对Facade的调用都会被转发到该类对象下。
        });
   }
}
Copier après la connexion
Étape 9

− Visitez l'URL suivante pour tester la façade.

http://localhost:8000/facadeex pour afficher le résultat

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal