ホームページ  >  記事  >  PHPフレームワーク  >  Laravelのコントラクトとファサードの詳細な説明

Laravelのコントラクトとファサードの詳細な説明

藏色散人
藏色散人転載
2020-04-15 13:42:463416ブラウズ

Contracts

Contracts は実際、分離の目的を達成するためにインターフェイス指向のプログラミングを提唱しています。これらの共通インターフェイスは、Laravel によって設計されています。これらはコントラクトです。

では、Laravel はどの実装を使用する必要があるかをどのようにして知るのでしょうか?

Laravel のデフォルトの Contracts バインディングでは、「Illuminate/Foundation/Application.php」にそのような定義があります: これは、デフォルトのインターフェース実装のバインディングです。

Recommendation: " laravel チュートリアル>>

/**
     * 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'],
        ];

カスタム インターフェイスを実装する場合、バインディングのために ServiceProvider で使用できます:

$this->app->bind('App\Contracts\EventPusher', 'App\Services\PusherEventPusher');

Facades

Facades は提供しますアプリケーションのサービスコンテナで利用可能なクラスの「静的」インターフェース。 Laravelの「ファサード」は、サービスコンテナ内の基本クラスの「静的プロキシ」として機能します。理解しにくいです?

プロジェクト ディレクトリの config/app.php を開き、

/*
    |--------------------------------------------------------------------------
    | 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,
    ],

を見つけます。何か見つかりましたか?はい、ファサードは実際には、config/app.php で定義された一連のクラスのエイリアスです。ただし、これらのクラスにはすべて、基本的な Illuminate\Support\Facades\Facade クラスを継承し、メソッド getFacadeAccessor が名前を返すという共通の機能があります。

カスタマイズされたファサード

リファレンス http://www.tutorialspoint.com/laravel/laravel_facades.htm

ステップ 1 -TestFacadesServiceProvider という名前の ServiceProvider を作成し、次のコマンドを使用します:

php Artisan make:provider TestFacadesServiceProvider

ステップ 2 - 基礎となるプロキシ クラスを作成し、「TestFacades」という名前を付けます.php” (「App/Test」)。

App/Test/TestFacades.php

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

ステップ 3 - 「TestFacades.php」という名前の Facade クラスを次の場所に作成します。 「App/Test/Facades」.

App/Test/Facades/TestFacades.php

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

ステップ 4 -「TestFacadesServiceProviders.php」という名前の ServiceProviders クラスを次の場所に作成します。 「App/Test/Facades」.

App/Providers/TestFacadesServiceProviders.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的调用都会被转发到该类对象下。
        });
   }
}

ステップ 5 - ServiceProvider を config/app.php クラスに登録します

ステップ 6 -config/app.phpでカスタム Facade エイリアスを登録します。

Use test:

app/ Http/routes.php に次の行を追加します。

Route::get(&#39;/facadeex&#39;, function(){
   return TestFacades::testingFacades();
});

ステップ 9 -次の URL にアクセスしてファサードをテストします。

http://localhost:8000/facadeex 出力を表示します

以上がLaravelのコントラクトとファサードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。