Laravel 中的设计模式解密:Facade

Laravel
设计模式对每个开发人员都非常重要。 它能解决项目中的常见问题。

Facade 模式定义

Facade 可帮助您隐藏类的任何复杂实现,以获取类的实例。

维基百科

Facade 是充当前端接口的对象,可掩盖更复杂的基础或结构代码。

问题

假设我们有一个CMS,每发布一个新帖子,我们都希望发布一条推文。

首先,我们使用 dg/twitter-php 库发送推文。在 README 文件中,以下代码将发布一条推文。

use DG\Twitter\Twitter;

$twitter = new Twitter($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);

$twitter->send('I am fine today.');

注意,每次需要获取 Twitter 实例时,都需要传递一些加密数据。但我们不希望每次发送推文时都要传递这些数据。

此外,我们不需要工厂(工厂模式),因为我们只想发送推文,如果在这里使用工厂的话,会让事情变得更复杂。

因此 Facade 模式可以通过创建 Facade 类来帮助我们隐藏创建实例的复杂性

class TwitterFacade 
{
  public static function get()
  {
    return new Twitter($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
  }
}

在 Laravel 把加密数据放入 config / services.php中。

'twitter' => [
    'api_key' => env('TWITTER_API_KEY'),
    'api_secret' => env('TWITTER_API_SECRET'),
    'api_token' => env('TWITTER_Access_TOKEN'),
    'api_token_secret' => env('TWITTER_Access_TOKEN_SECRET'),
],

更新 Facade 类以使用如下配置:

class TwitterFacade 
{
  public static function get()
  {
      $config = config('services.twitter');
      return new Twitter($config['api_key'], $config['api_secret'], $config['api_token'], $config['api_token_secret']);
  }
}

现在,每当我们要发送推文时,我们只需写一行

TwitterFacade::get()->send('Test tweet from a facade class');

在 Laravel 中使用 Facade

Laravel 支持 Facade 模式及其一部分核心系统。 如果你打开 config/app.php 并滚动到 aliases ,你会看到一堆 Facades

'aliases' => [

    'App' => Illuminate\Support\Facades\App::class,
    'Arr' => Illuminate\Support\Arr::class,
    'Artisan' => Illuminate\Support\Facades\Artisan::class,
    'Auth' => Illuminate\Support\Facades\Auth::class,
    'Blade' => Illuminate\Support\Facades\Blade::class,
    'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
    'Bus' => Illuminate\Support\Facades\Bus::class,
    'Cache' => Illuminate\Support\Facades\Cache::class,
    'Config' => Illuminate\Support\Facades\Config::class,
    'Cookie' => Illuminate\Support\Facades\Cookie::class,
    'Crypt' => Illuminate\Support\Facades\Crypt::class,
    'DB' => Illuminate\Support\Facades\DB::class,
    'Eloquent' => Illuminate\Database\Eloquent\Model::class,
    'Event' => Illuminate\Support\Facades\Event::class,
    'File' => Illuminate\Support\Facades\File::class,
    'Gate' => Illuminate\Support\Facades\Gate::class,
    'Hash' => Illuminate\Support\Facades\Hash::class,
    'Lang' => Illuminate\Support\Facades\Lang::class,
    'Log' => Illuminate\Support\Facades\Log::class,
    'Mail' => Illuminate\Support\Facades\Mail::class,
    'Notification' => Illuminate\Support\Facades\Notification::class,
    'Password' => Illuminate\Support\Facades\Password::class,
    'Queue' => Illuminate\Support\Facades\Queue::class,
    'Redirect' => Illuminate\Support\Facades\Redirect::class,
    'Redis' => Illuminate\Support\Facades\Redis::class,
    'Request' => Illuminate\Support\Facades\Request::class,
    'Response' => Illuminate\Support\Facades\Response::class,
    'Route' => Illuminate\Support\Facades\Route::class,
    'Schema' => Illuminate\Support\Facades\Schema::class,
    'Session' => Illuminate\Support\Facades\Session::class,
    'Storage' => Illuminate\Support\Facades\Storage::class,
    'Str' => Illuminate\Support\Str::class,
    'URL' => Illuminate\Support\Facades\URL::class,
    'Validator' => Illuminate\Support\Facades\Validator::class,
    'View' => Illuminate\Support\Facades\View::class,

],

Now let's create a new class in App/Facades/TwitterFacade.php and put the following content

namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class TwitterFacade extends Facade 
{
    protected static function getFacadeAccessor()
    {
        return 'twitter-poster';
    }
}

notice that we are extending Facade from Illuminate namespace and then we implemented getFacadeAccessor. we choose 'twitter-poster' as the name of the Twitter object that we want to use.

Now let's jump to the AppServiceProvider to bind the 'twitter-poster' to Twitter. in AppServiceProvider at Register method add the following

use DG\Twitter\Twitter;

public function register()
{
    $this->app->bind('twitter-poster',function(){
        $config = config('services.twitter');
        return new Twitter($config['api_key'], $config['api_secret'], $config['api_token'], $config['api_token_secret']);
    });
}

Now you can see the connection. first, we registered 'twitter-poster' and bind it to an instance of a Twitter class.

The final usage of our facade will be like following

Route::get('/tweet',function(){

    \App\Facades\TwitterFacade::send('Hello from ahmedash.com: Facade design pattern article');

});

Conclusion

We learned what is Facade and what problem does it solve and how to use it with Laravel

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://dev.to/ahmedash95/design-pattern...

译文地址:https://learnku.com/laravel/t/41695

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!