设计模式对每个开发人员都非常重要。 它能解决项目中的常见问题。
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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。