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 'test'; } }
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('test',function() { // return new AppTestTestFacades; // }); //也可以這么綁定,推薦。這個test對應于Facade的getFacadeAccessor返回值 $this->app->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去查看輸出