Contracts
Contracts其實(shí)就是倡導(dǎo)面向接口編程,來達(dá)到解耦的目的。而這些通用的接口已經(jīng)由Laravel為你設(shè)計(jì)好了。就是這些Contracts.
那么Laravel如何知道我們需要使用哪個實(shí)現(xiàn)呢?
在Laravel默認(rèn)的Contracts綁定中,在'Illuminate/Foundation/Application.php'有這樣的定義:這就是綁定了默認(rèn)的接口實(shí)現(xiàn).
推薦:《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'], ];
在我們自定義的接口實(shí)現(xiàn)時,我們可以在ServiceProvider中使用進(jìn)行綁定:
$this->app->bind('AppContractsEventPusher', 'AppServicesPusherEventPusher');
Facades
Facades 為應(yīng)用程序的服務(wù)容器中可用的類提供了一個「靜態(tài)」接口。Laravel 「facades」作為在服務(wù)容器內(nèi)基類的「靜態(tài)代理」。很難懂?
我們打開項(xiàng)目目錄下的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, ],
你是不是發(fā)現(xiàn)了什么?對,F(xiàn)acades其實(shí)就是在config/app.php中定義的一系列類的別名。只不過這些類都具有一個共同的特點(diǎn),那就是繼承基底 IlluminateSupportFacadesFacade 類并實(shí)現(xiàn)一個方法:getFacadeAccessor返回名稱。
自定義Facade
參考http://www.tutorialspoint.com/laravel/laravel_facades.htm
Step 1 ?創(chuàng)建一個名為 TestFacadesServiceProvider的ServiceProvider ,使用如下命令即可:
php artisan make:provider TestFacadesServiceProvider
Step 2 ? 創(chuàng)建一個底層代理類,命名為“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 ? 創(chuàng)建一個 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 ?創(chuàng)建一個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對應(yīng)于Facade的getFacadeAccessor返回值 $this->app->bind("test", function(){ return new MyFoo(); //給這個Facade返回一個代理實(shí)例。所有對Facade的調(diào)用都會被轉(zhuǎn)發(fā)到該類對象下。 }); } }
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去查看輸出