Fasad
-
- PengenalanPerkhidmatan Fasad
- untuk "aplikasi statik". Laravel dilengkapi dengan banyak Fasad yang menyediakan akses kepada kebanyakan fungsi. Laravel Facades sebenarnya ialah "proksi statik" untuk kelas asas dalam bekas perkhidmatan Berbanding dengan kaedah statik tradisional, ia boleh memberikan sintaks yang lebih fleksibel, lebih mudah untuk diuji dan lebih elegan apabila digunakan. Semua Fasad Laravel ditakrifkan di bawah ruang nama . Jadi, kita boleh menggunakan Facade dengan mudah:
use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key'); });
Dalam dokumentasi Laravel, terdapat banyak kod sampel yang menggunakan Facades untuk menunjukkan pelbagai fungsi rangka kerja. Bila menggunakan Facades
Facades mempunyai banyak kelebihan Ia menyediakan sintaks yang ringkas dan mudah diingat yang menghilangkan keperluan untuk menyuntik atau mengkonfigurasi nama kelas panjang secara manual. Selain itu, mereka membuat ujian sangat mudah kerana panggilan unik mereka kepada kaedah statik PHP.
Namun, terdapat beberapa tempat yang memerlukan perhatian khusus apabila menggunakan Facades. Bahaya utama apabila menggunakan Facades ialah pengembangan skop kelas. Memandangkan Facades sangat mudah digunakan dan tidak memerlukan suntikan, kami secara tidak sengaja boleh menggunakan banyak Facades dalam satu kelas, menyebabkan kelas menjadi lebih besar dan lebih besar. Walau bagaimanapun, apabila menggunakan suntikan kebergantungan, lebih banyak kelas digunakan, lebih lama kaedah pembinaannya Secara visual, dilihat bahawa kelas ini agak besar. Oleh itu, apabila menggunakan Facades, beri perhatian khusus untuk mengawal saiz kelas untuk memastikan skop kelas pendek.
{tip} Apabila membangunkan pakej sambungan pihak ketiga yang berinteraksi dengan Laravel, adalah lebih baik untuk menyuntik kontrak Laravel daripada menggunakan Facades. Oleh kerana sambungan dibina di luar Laravel, anda tidak boleh menggunakan Laravel Facades untuk menguji fungsi pembantu
Facades over Dependency Injection
Salah satu faedah utama suntikan dependencywap ialah keupayaan untuk menyuntik kelas. Sangat berguna apabila menguji kerana anda boleh menyuntik mock atau stub dan menegaskan pelbagai kaedah pada stub.
Biasanya, kaedah yang benar-benar statik adalah mustahil untuk dipermainkan atau ditikam. Walau bagaimanapun, Facades menggunakan kaedah dinamik untuk memproksi penggunaan kaedah objek yang dihuraikan dalam bekas perkhidmatan Kami juga boleh menguji Facades seperti menguji kejadian kelas yang disuntik. Contohnya, seperti laluan berikut:
use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key'); });
Kami boleh menulis kod ujian berikut dengan parameter yang kami jangkakan untuk mengesahkan kaedah
Cache::get
:Cache::get
方法:use Illuminate\Support\Facades\Cache; /** * 一个基础功能的测试。 * * @return void */ public function testBasicExample(){ Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $this->visit('/cache') ->see('value'); }
Facades 相较于辅助函数
除了 Facades,Laravel 还包含各种 『辅助函数』 来实现这些常用功能,比如生成视图、触发事件、任务调度或者发送 HTTP 响应。许多辅助函数都有与之对应的 Facades 。例如,下面这个 Facades 和辅助函数的作用是一样的:
return View::make('profile');return view('profile');
Facade 和辅助函数之间没有实际的区别。当你使用辅助函数时,你可以像测试相应的 Facade 那样进行测试。例如,下面的路由:
Route::get('/cache', function () { return cache('key');});
在底层实现,辅助函数
cache
实际是调用Cache
这个 Facade 的get
use Illuminate\Support\Facades\Cache; /** * 一个基础功能的测试用例。 * * @return void */ public function testBasicExample(){ Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $this->visit('/cache') ->see('value'); }
Facades Berbanding dengan fungsi helperSelain Facades, Laravel juga mengandungi pelbagai "fungsi pembantu" untuk melaksanakan fungsi biasa ini . Contohnya, menjana paparan, mencetuskan acara, menjadualkan tugas atau menghantar respons HTTP. Banyak fungsi tambahan mempunyai Fasad yang sepadan. Contohnya, fungsi Fasad dan pembantu berikut melakukan perkara yang sama: 🎜<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Cache; class UserController extends Controller{ /** * 显示给定用户的信息。 * * @param int $id * @return Response */ public function showProfile($id) { $user = Cache::get('user:'.$id); return view('profile', ['user' => $user]); } }
🎜 Tiada perbezaan nyata antara fungsi Fasad dan pembantu. Apabila anda menggunakan fungsi pembantu, anda boleh mengujinya sama seperti Fasad yang sepadan. Sebagai contoh, laluan berikut: 🎜class Cache extends Facade{ /** * 获取组件的注册名称。 * * @return string */ protected static function getFacadeAccessor() { return 'cache'; } }
🎜 dilaksanakan di bahagian bawah, dan fungsi tambahancache
sebenarnya memanggil kaedahget
bagiCache
Fasad. Oleh itu, walaupun kami menggunakan fungsi pembantu, kami masih boleh menulis kod ujian berikut dengan parameter yang kami harapkan untuk mengesahkan kaedah: 🎜<?php namespace App; use App\Contracts\Publisher; use Illuminate\Database\Eloquent\Model; class Podcast extends Model{ /** * 发布 Podcast。 * * @param Publisher $publisher * @return void */ public function publish(Publisher $publisher) { $this->update(['publishing' => now()]); $publisher->publish($this); } }
🎜🎜🎜🎜🎜🎜Cara Facades berfungsi
Dalam aplikasi Laravel, Facade ialah kelas yang boleh mengakses objek daripada bekas. Komponen teras ialah kelas
Facade
. Sama ada Facades Laravel sendiri atau Facades tersuai, semuanya mewarisi daripada kelasIlluminateSupportFacadesFacade
.Facade
类。不管是 Laravel 自带的 Facades,还是自定义的 Facades,都继承自IlluminateSupportFacadesFacade
类。Facade
基类使用了__callStatic()
魔术方法,直到对象从容器中被解析出来后,才会进行调用。在下面的例子中,调用了 Laravel 的缓存系统。通过浏览这段代码,可以假定在Cache
类中调用了静态方法get
:<?php namespace App; use Facades\App\Contracts\Publisher; use Illuminate\Database\Eloquent\Model; class Podcast extends Model{ /** * 发布 Podcast。 * * @return void */ public function publish() { $this->update(['publishing' => now()]); Publisher::publish($this); } }
注意在上面这段代码中,我们『导入』了
Cache
Facade。这个 Facade 作为访问IlluminateContractsCacheFactory
接口底层实现的代理。我们使用 Facade 进行的任何调用都将传递给 Laravel 缓存服务的底层实例。如果我们看一下
IlluminateSupportFacadesCache
这个类,你会发现类中根本没有get
这个静态方法:<?php namespace Tests\Feature;use App\Podcast; use Tests\TestCase;use Facades\App\Contracts\Publisher; use Illuminate\Foundation\Testing\RefreshDatabase; class PodcastTest extends TestCase{ use RefreshDatabase; /** * 一个测试演示。 * * @return void */ public function test_podcast_can_be_published() { $podcast = factory(Podcast::class)->create(); Publisher::shouldReceive('publish')->once()->with($podcast); $podcast->publish(); } }
Cache
Facade 继承了 Facade 类,并且定义了getFacadeAccessor()
方法。这个方法的作用是返回服务容器绑定的名称。当用户调用Cache
Facade 中的任何静态方法时,Laravel 会从 服务容器 中解析cache
绑定以及该对象运行所请求的方法(在这个例子中就是get
方法)。实时 Facades
使用实时 Facades,你可以将应用程序中的任何类视为 Facade。为了说明这是如何使用的,我们来看看另一种方法。例如,假设我们的
rrreeePodcast
模型有一个publish
方法。然而,为了发布 Podcast,我们需要注入一个Publisher
实例:将发布者的实现注入到该方法中,我们可以轻松地测试这种方法,因为我们可以模拟注入的发布者。但是,它要求我们每次调用
rrreeepublish
方法时都要传递一个发布者实例。使用实时的 Facades,我们可以保持同样的可测试性,而不需要显式地通过Publisher
实例。要生成实时Facade
,请在导入类的名称空间中加上 Facades:当使用实时 Facade 时,发布者实现将通过使用
Facades
Fasad Kelas asas menggunakan kaedah ajaib __callStatic()
, yang tidak akan dipanggil sehingga objek dihuraikan keluar dari bekas. Dalam contoh di bawah, sistem caching Laravel dipanggil. Dengan menyemak imbas kod ini, boleh diandaikan bahawa kaedah statikget
dipanggil dalam kelasCache
: Jika kita melihat kelasIlluminateSupportFacadesCache
, anda akan mendapati tiada kaedah statikget
dalam kelas:rrreeeCache
Facade mewarisi kelas Facade dan mentakrifkan kaedahgetFacadeAccessor()
. Fungsi kaedah ini adalah untuk mengembalikan nama bekas perkhidmatan yang mengikat. Apabila pengguna memanggil sebarang kaedah statik dalam FasadCache
, Laravel menyelesaikan pengikatancache
daripada bekas perkhidmatan dan objek menjalankan kaedah yang diminta (dalam kes iniget
kaedah). 🎜🎜🎜🎜🎜🎜Real-time Facades🎜🎜Menggunakan Facades masa nyata, anda boleh menambah sebarang kelas dalam permohonan anda Dianggap sebagai Fasad. Untuk menggambarkan bagaimana ini digunakan, mari kita lihat kaedah lain. Sebagai contoh, katakan modelPodcast
kami mempunyai kaedahpublish
. Walau bagaimanapun, untuk menerbitkan Podcast, kami perlu menyuntik contohPublisher
: 🎜rrreee🎜Suntikan pelaksanaan penerbit ke dalam kaedah, yang boleh kami uji dengan mudah kerana kami boleh mengejek penerbit yang disuntik. Walau bagaimanapun, ia memerlukan kami untuk menghantar contoh penerbit setiap kali kami memanggil kaedahpublish
. Menggunakan Facades langsung, kami boleh mengekalkan kebolehujian yang sama tanpa menghantar contohPenerbit
secara eksplisit. Untuk menjanaFasad secara langsung, tambah Facades pada ruang nama kelas yang diimport: 🎜rrreee🎜 Apabila menggunakan fasad langsung, pelaksanaan penerbit akan muncul dengan menggunakan bahagian awalan Facades
antara muka atau nama kelas untuk menyelesaikan masalah bekas perkhidmatan. Apabila menguji, kami boleh menggunakan fungsi pembantu ujian fasad terbina dalam Laravel untuk mensimulasikan panggilan kaedah ini: 🎜rrreee🎜🎜🎜🎜🎜🎜Rujukan Kelas Fasad
Di bawah anda boleh menemui setiap kelas Fasad dan kelas asasnya yang sepadan. Ini ialah alat untuk mencari dokumentasi API untuk kelas Fasad tertentu. Maklumat utama untuk pengikatan bekas perkhidmatan juga disertakan.
.Artisan AuthIlluminateContractsConsoleKernel artisan kod> IlluminateAuthAuthManager auth app
Artisan IlluminateContractsConsoleKernel artisan
Auth IlluminateAuthAuthManager auth
Auth (Instance) IlluminateContractsAuthGuard auth.driver
Blade IlluminateViewCompilersBladeCompiler blade.compiler
Broadcast IlluminateContractsBroadcastingFactory Broadcast (Instance) IlluminateContractsBroadcastingBroadcaster Bus IlluminateContractsBusDispatcher Cache IlluminateCacheCacheManager cache
IlluminateAuthAuthManager🎜🎜Cache (Instance) IlluminateCacheRepository cache.store
Auth (Instance)auth🎜🎜🎜🎜Auth (Instance)🎜🎜IlluminateContracts 🎜🎜Bilah🎜🎜 IlluminateViewCompilersBladeCompiler🎜🎜 blade.compiler🎜🎜🎜🎜Siaran🎜🎜IlluminateContractsBroadcastingFactory🎜🎜 🎜🎜🎜🎜🎜Broadcast🎜🎜 roadcastingBroadcaster🎜🎜 🎜🎜🎜🎜Bas🎜🎜IlluminateContractsBusDispatcher🎜🎜 🎜🎜🎜🎜 Cache🎜🎜IlluminateCacheCacheManager🎜🎜 cache🎜🎜🎜🎜Cache (Instance)🎜🎜IlluminateCacheRepository🎜🎜 cache.store🎜. IlluminateEncryptionEncrypter encrypter kod> config
Cookie IlluminateCookieCookieJar cookie
Crypt IlluminateEncryptionEncrypter encrypter
DB IlluminateDatabaseDatabaseManager db
DB (Instance) IlluminateDatabaseConnection db.connection
Event IlluminateEventsDispatcher events
File IlluminateFilesystemFilesystem files
Gate IlluminateContractsAuthAccessGate Hash IlluminateContractsHashingHasher hash
Lang IlluminateTranslationTranslator translator
IlluminateDatabaseDatabaseManager🎜🎜Log IlluminateLogLogManager log
DBdb🎜🎜🎜🎜DB (Instance)🎜🎜IlluminateDatabaseManager🎜🎜 db🎜🎜🎜🎜DB (Instance)🎜🎜IlluminateDatabaseManager🎜🜜SambunganDatabase🎜🎜Connection🎜 🎜🎜Acara🎜🎜 IlluminateEventsDispatcher🎜🎜 acara🎜🎜🎜🎜File🎜🎜IlluminateFilesystemFilesystem🎜🎜 🎜🎜🎜🎜Lang🎜🎜IlluminateTranslationTranslator🎜🎜fail 🎜🎜🎜🎜Fail🎜🎜IlluminateFilesystemFilesystem🎜🎜fail 🎜🎜🎜🎜Illuminate🎜Aucess🎜Gate 🎜🎜 🎜🎜🎜🎜Hash🎜🎜IlluminateContractsHashingHasher🎜🎜< kod>cincangpenterjemah 🎜🎜🎜🎜Log🎜🎜IlluminateLogLogManager🎜🎜>🎜>🎜>LogManager🎜Mail IlluminateMailMailer mel mailer
Notification IlluminateNotificationsChannelManager Password IlluminateAuthPasswordsPasswordBrokerManager auth.password
Password (Instance) IlluminateAuthPasswordsPasswordBroker auth.password.broker
Queue IlluminateQueueQueueManager queue
Queue (Instance) IlluminateContractsQueueQueue queue.connection
Queue (Base Class) IlluminateQueueQueue Redirect IlluminateRoutingRedirector redirect
Redis IlluminateRedisRedisManager redis
Redis (Instance) IlluminateRedisConnectionsConnection redis.connection
🎜Pemberitahuan🎜🎜IlluminateNotificationsChannelManager🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 🎜🎜 uminateAuthPasswordsPasswordBrokerManager🎜🎜Request IlluminateHttpRequest request
auth.password🎜🎜🎜🎜 Kata Laluan (Instance)🎜🎜IlluminateAuthPasswordsPasswordBroker🎜🎜 auth.password.broker🎜🎜🎜🎜Queue🎜🎜IlluminateQueueQueueManager🎜🎜🎜🎜 ue (Instance)🎜🎜IlluminateContractsQueueQueue 🎜🎜 baris gilir.sambungan 🎜🎜🎜🎜Baris Gilir (Kelas Asas)🎜🎜IlluminateQueueQueue🎜🎜 🎜🎜🎜🎜Redirect🎜🎜>IlluminateQueue🎜🎜 🎜🎜🎜🎜Redirect🎜🎜>IlluminateRecodeR 🎜🎜🎜🎜Redis🎜 🎜IlluminateRedisRedisManager🎜🎜redis
🎜🎜🎜🎜Redis (Instance)🎜🎜IlluminateRedisConnectionsConnection🎜🎜redis.connection
🎜Illuminate HttpRequest🎜🎜permintaan< /kod>🎜🎜 Response IlluminateContractsRoutingResponseFactory Response (Instance) IlluminateHttpResponse ingRouter router
Schema IlluminateDatabaseSchemaBuilder Session IlluminateSessionSessionManager session
Session (Instance) IlluminateSessionStore session.store
Storage IlluminateFilesystemFilesystemManager filesystem
Storage (Instance) IlluminateContractsFilesystemFilesystem filesystem.disk
URL IlluminateRoutingUrlGenerator url
Validator IlluminateValidationFactory validator
router . 🎜Storage🎜🎜IlluminateFilesystemFilesystemManager🎜🎜Skim IlluminateDatabaseSchemaBuilder sistem fail 🎜🎜🎜🎜Penyimpanan (Instance)🎜🎜IlluminateContractsFilesystemFilesystem🎜🎜sistem fail.cakera🎜🎜🎜🎜URL🎜IlluminateContractsFilesystemFilesystem🎜🎜 filesystem.disk
🎜🎜🎜🎜URL🎜🎜🎜URL🎜Generator🎜URL🎜Urluminate🎜 kod>🎜 🎜🎜🎜Validator🎜🎜IlluminateValidationFactory🎜🎜validator🎜🎜🎜🎜Validator (Instance)🎜🎜IlluminateValidation🎜🎜 View illuminateviewfactory view
view (Instance) illuminateViewview