php facade模式怎么用,Laravel 中的设计模式解密:Facade

d013e049fcfa90c3e6bdf8f63a09005c.png

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

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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值