Laravel之Contracts和Facades詳解

contracts

Contracts其實就是倡導面向接口編程,來達到解耦的目的。而這些通用的接口已經由laravel為你設計好了。就是這些Contracts.

那么Laravel如何知道我們需要使用哪個實現呢?

在Laravel默認的Contracts綁定中,在’Illuminate/Foundation/Application.php’有這樣的定義:這就是綁定了默認的接口實現.

推薦:《laravel教程

/** ?????*?Register?the?core?class?aliases?in?the?container. ?????* ?????*?@return?void ?????*/ ????public?function?registerCoreContainerAliases() ????{ ????????$aliases?=?[ ????????????'app'??????????????????=>?['IlluminateFoundationApplication',?'IlluminateContractsContainerContainer',?'IlluminateContractsFoundationApplication'], ????????????'auth'?????????????????=>?'IlluminateAuthAuthManager', ????????????'auth.driver'??????????=>?['IlluminateAuthGuard',?'IlluminateContractsAuthGuard'], ????????????'auth.password.tokens'?=>?'IlluminateAuthPasswordsTokenRepositoryInterface', ????????????'blade.compiler'???????=>?'IlluminateViewCompilersBladeCompiler', ????????????'cache'????????????????=>?['IlluminateCacheCacheManager',?'IlluminateContractsCacheFactory'], ????????????'cache.store'??????????=>?['IlluminateCacheRepository',?'IlluminateContractsCacheRepository'], ????????????'config'???????????????=>?['IlluminateConfigRepository',?'IlluminateContractsConfigRepository'], ????????????'cookie'???????????????=>?['IlluminateCookieCookieJar',?'IlluminateContractsCookieFactory',?'IlluminateContractsCookieQueueingFactory'], ????????????'encrypter'????????????=>?['IlluminateEncryptionEncrypter',?'IlluminateContractsEncryptionEncrypter'], ????????????'db'???????????????????=>?'IlluminateDatabaseDatabaseManager', ????????????'db.connection'????????=>?['IlluminateDatabaseConnection',?'IlluminateDatabaseConnectionInterface'], ????????????'events'???????????????=>?['IlluminateEventsDispatcher',?'IlluminateContractsEventsDispatcher'], ????????????'files'????????????????=>?'IlluminateFilesystemFilesystem', ????????????'filesystem'???????????=>?['IlluminateFilesystemFilesystemManager',?'IlluminateContractsFilesystemFactory'], ????????????'filesystem.disk'??????=>?'IlluminateContractsFilesystemFilesystem', ????????????'filesystem.cloud'?????=>?'IlluminateContractsFilesystemCloud', ????????????'hash'?????????????????=>?'IlluminateContractsHashingHasher', ????????????'translator'???????????=>?['IlluminateTranslationTranslator',?'SymfonyComponentTranslationTranslatorInterface'], ????????????'log'??????????????????=>?['IlluminateLogWriter',?'IlluminateContractsLoggingLog',?'PsrLogLoggerInterface'], ????????????'mailer'???????????????=>?['IlluminateMailMailer',?'IlluminateContractsMailMailer',?'IlluminateContractsMailMailQueue'], ????????????'auth.password'????????=>?['IlluminateAuthPasswordsPasswordBroker',?'IlluminateContractsAuthPasswordBroker'], ????????????'queue'????????????????=>?['IlluminateQueueQueueManager',?'IlluminateContractsQueueFactory',?'IlluminateContractsQueueMonitor'], ????????????'queue.connection'?????=>?'IlluminateContractsQueueQueue', ????????????'redirect'?????????????=>?'IlluminateRoutingRedirector', ????????????'redis'????????????????=>?['IlluminateRedisDatabase',?'IlluminateContractsRedisDatabase'], ????????????'request'??????????????=>?'IlluminateHttpRequest', ????????????'router'???????????????=>?['IlluminateRoutingRouter',?'IlluminateContractsRoutingRegistrar'], ????????????'session'??????????????=>?'IlluminateSessionSessionManager', ????????????'session.store'????????=>?['IlluminateSessionStore',?'SymfonyComponentHttpFoundationSessionSessionInterface'], ????????????'url'??????????????????=>?['IlluminateRoutingUrlGenerator',?'IlluminateContractsRoutingUrlGenerator'], ????????????'validator'????????????=>?['IlluminateValidationFactory',?'IlluminateContractsValidationFactory'], ????????????'view'?????????????????=>?['IlluminateViewFactory',?'IlluminateContractsViewFactory'], ????????];

在我們自定義的接口實現時,我們可以在ServiceProvider中使用進行綁定:

$this->app->bind('AppContractsEventPusher',?'AppServicesPusherEventPusher');

Facades

Facades 為應用程序的服務容器中可用的類提供了一個「靜態」接口。Laravel 「facades」作為在服務容器內基類的「靜態代理」。很難懂?

我們打開項目目錄下的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'???????=>?IlluminateSupportFacadesApp::class, ????????'Artisan'???=>?IlluminateSupportFacadesArtisan::class, ????????'Auth'??????=>?IlluminateSupportFacadesAuth::class, ????????'Blade'?????=>?IlluminateSupportFacadesBlade::class, ????????'Bus'???????=>?IlluminateSupportFacadesBus::class, ????????'Cache'?????=>?IlluminateSupportFacadesCache::class, ????????'Config'????=>?IlluminateSupportFacadesConfig::class, ????????'Cookie'????=>?IlluminateSupportFacadesCookie::class, ????????'Crypt'?????=>?IlluminateSupportFacadesCrypt::class, ????????'DB'????????=>?IlluminateSupportFacadesDB::class, ????????'Eloquent'??=>?IlluminateDatabaseEloquentModel::class, ????????'Event'?????=>?IlluminateSupportFacadesEvent::class, ????????'File'??????=>?IlluminateSupportFacadesFile::class, ????????'Gate'??????=>?IlluminateSupportFacadesGate::class, ????????'Hash'??????=>?IlluminateSupportFacadesHash::class, ????????'Input'?????=>?IlluminateSupportFacadesInput::class, ????????'Lang'??????=>?IlluminateSupportFacadesLang::class, ????????'Log'???????=>?IlluminateSupportFacadesLog::class, ????????'Mail'??????=>?IlluminateSupportFacadesMail::class, ????????'Password'??=>?IlluminateSupportFacadesPassword::class, ????????'Queue'?????=>?IlluminateSupportFacadesQueue::class, ????????'Redirect'??=>?IlluminateSupportFacadesRedirect::class, ????????'Redis'?????=>?IlluminateSupportFacadesRedis::class, ????????'Request'???=>?IlluminateSupportFacadesRequest::class, ????????'Response'??=>?IlluminateSupportFacadesResponse::class, ????????'Route'?????=>?IlluminateSupportFacadesRoute::class, ????????'Schema'????=>?IlluminateSupportFacadesSchema::class, ????????'Session'???=>?IlluminateSupportFacadesSession::class, ????????'Storage'???=>?IlluminateSupportFacadesStorage::class, ????????'URL'???????=>?IlluminateSupportFacadesURL::class, ????????'Validator'?=>?IlluminateSupportFacadesValidator::class, ????????'View'??????=>?IlluminateSupportFacadesView::class, ????],

你是不是發現了什么?對,Facades其實就是在config/app.php中定義的一系列類的別名。只不過這些類都具有一個共同的特點,那就是繼承基底 IlluminateSupportFacadesFacade 類并實現一個方法:getFacadeAccessor返回名稱。

自定義Facade

參考http://www.tutorialspoint.com/laravel/laravel_facades.htm

Step 1 ?創建一個名為 TestFacadesServiceProvider的ServiceProvider ,使用如下命令即可:

php artisan make:provider TestFacadesServiceProvider

Step 2 ? 創建一個底層代理類,命名為“TestFacades.php” at “App/Test”.

App/Test/TestFacades.php

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

Step 3 ? 創建一個 Facade 類 called “TestFacades.php” at “App/Test/Facades”.

App/Test/Facades/TestFacades.php

<?php namespace appTestFacades; use IlluminateSupportFacadesFacade; class TestFacades extends Facade{    protected static function getFacadeAccessor() { return &#39;test&#39;; } }

Step 4 ?創建一個ServiceProviders類,名為“TestFacadesServiceProviders.php” at “App/Test/Facades”.

App/Providers/TestFacadesServiceProviders.php

<?php namespace AppProviders; use App; use IlluminateSupportServiceProvider; class TestFacadesServiceProvider extends ServiceProvider {    public function boot() {       //    }    public function register() {      //可以這么綁定,這需要use App;     //  App::bind(&#39;test&#39;,function() {     //     return new AppTestTestFacades;     //  });            //也可以這么綁定,推薦。這個test對應于Facade的getFacadeAccessor返回值         $this->app-&gt;bind("test",?function(){ ????????????return?new?MyFoo();?//給這個Facade返回一個代理實例。所有對Facade的調用都會被轉發到該類對象下。 ????????}); ???} }

Step 5 ? 在config/app.php注冊ServiceProvider類

Step 6 ? 在config/app.php注冊自定義Facade的別名

使用測試:

Add the following lines in app/Http/routes.php.

Route::get('/facadeex',?function(){ ???return?TestFacades::testingFacades(); });

Step 9 ? Visit the following URL to test the Facade.

http://localhost:8000/facadeex去查看輸出

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享