12/08/2018, 17:43

Laravel Facades P.2

Real-Time Facades Sử dụng real-time facades, bạn có thể sử dụng bất cứ class nào trong application của miễn là nó có một facade. Để minh họa điều này chúng ta hãy đến với một ví dụ nhỏ sau . giả sử chúng ta có 1 model Podcast có 1 publish method . tuy nhiên để pushblish podcast thì chúng ta cần ...

Real-Time Facades

Sử dụng real-time facades, bạn có thể sử dụng bất cứ class nào trong application của miễn là nó có một facade. Để minh họa điều này chúng ta hãy đến với một ví dụ nhỏ sau . giả sử chúng ta có 1 model Podcast có 1 publish method . tuy nhiên để pushblish podcast thì chúng ta cần inject một Publiser instance :

<?php

namespace App;

use AppContractsPublisher;
use IlluminateDatabaseEloquentModel;

class Podcast extends Model
{
    /**
     * Publish the podcast.
     *
     * @param  Publisher  $publisher
     * @return void
     */
    public function publish(Publisher $publisher)
    {
        $this->update(['publishing' => now()]);

        $publisher->publish($this);
    }
}

Việc thực hiện inject một publisher trong vào trong method cho phép chúng ta dễ dàng kiểm tra phương pháp này một cách độc lập trước khi chúng ta có thể mock injected pulisher. Tuy nhiên thì nó yêu cầu chúng ta luôn luôn phải pass một pulisher instance mỗi khi chúng ta call đến publish method. Việc sử dụng real-time facades, chúng ta có thể duy trì khả năng test tương tự trong khi không bắt buộc phải pass một Publisher instance. Dể có thể tạo một real-time facade, thì cần phải thêm vào prefix Facase vào trước phần namespace của class:

<?php

namespace App;

use FacadesAppContractsPublisher;
use IlluminateDatabaseEloquentModel;

class Podcast extends Model
{
    /**
     * Publish the podcast.
     *
     * @return void
     */
    public function publish()
    {
        $this->update(['publishing' => now()]);

        Publisher::publish($this);
    }
}

Khi sử dụng real-time Facades, việc triển khai publisher sẽ được resolved ra khỏi vùng đang sử dụng service container bằng cách sử dụng phần interface hoặc tên class xuất hiện sau tiền tố Facades. Khi testing, chúng ta có thể sử dụng Laravel's built-in facade testing helper để mocck method call:

<?php

namespace TestsFeature;

use AppPodcast;
use TestsTestCase;
use FacadesAppContractsPublisher;
use IlluminateFoundationTestingRefreshDatabase;

class PodcastTest extends TestCase
{
    use RefreshDatabase;

    /**
     * A test example.
     *
     * @return void
     */
    public function test_podcast_can_be_published()
    {
        $podcast = factory(Podcast::class)->create();

        Publisher::shouldReceive('publish')->once()->with($podcast);

        $podcast->publish();
    }
}

Thao khảo các class facade

Dưới đây bạn sẽ tìm thấy mọi facades và class basic của nó. Đây là một công cụ hữu ích để nhanh chóng đào sâu vào tài liệu API cho một facades root đã cho sẵn. Các service container binding key cũng được included nếu có.

Facade Class Service Container Binding
App IlluminateFoundationApplication 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
Cache (Instance) IlluminateCacheRepository cache.store
Config IlluminateConfigRepository 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
Log IlluminateLogLogger log
Mail IlluminateMailMailer 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
Request IlluminateHttpRequest request
Response IlluminateContractsRoutingResponseFactory
Response (Instance) IlluminateHttpResponse
Route IlluminateRoutingRouter 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
Validator (Instance) IlluminateValidationValidator
View IlluminateViewFactory view
View (Instance) IlluminateViewView

Nguồn https://laravel.com/docs/5.6/facades

0