如何在 Laravel 项目中创建自己的 Facade
通过这篇文章,我们可以学会如何定义自己的facade
类,并且在我们的项目中使用它。
这里我想创建一个名称为SmartLogger
的类,同时尝试使用它,下面让我们开始吧:
首先创建一个以SmartLogger命名的目录,并且在目录中创建如下php文件:
.
├── SmartLoggerFacade.php
└── SmartLogger.php
0 directories, 2 files
SmartLogger.php
<?php
namespace App\SmartLogger;
class SmartLogger {
public function log($text) {
$path = storage_path('logs');
$myfile = fopen("{$path}/SmartLog.txt", "a");
fwrite($myfile, $text);
fwrite($myfile, PHP_EOL);
fclose($myfile);
}
}
SmartLoggerFacade.php
<?php
namespace App\SmartLogger;
use Illuminate\Support\Facades\Facade;
class SmartLoggerFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'smartlogger';
}
}
创建 service provider
php artisan make:provider SmartLoggerServiceProvider
SmartLoggerServiceProvider.php
<?php
namespace App\Providers;
use App\SmartLogger\SmartLogger;
use Illuminate\Support\ServiceProvider;
class SmartLoggerServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
$this->app->bind('smartlogger',function(){
return new SmartLogger();
});
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
打开文件 config\app.php 找到providers
数组,添加刚创建的类
...
App\Providers\SmartLoggerServiceProvider::class
在aliaes数组中创建别名
...
'Smartlogger' => App\SmartLogger\SmartLoggerFacade::class
可以对刚创建的facades类进行测试了 :)
//在需要使用的控制器中先引入类,
use App\SmartLogger\SmartLoggerFacade as SmartLogger;
//在方法体中静态调用测试下,是否正常执行输出吧。
SmartLogger::log("Hi");
感谢阅读
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
明白了Facade的来龙去脉
瞬间 明白吗 门面到底是个什东西 自己应该怎么去写,什么服务容器什么的都可以出这样的教程 一下子就明白了 非常不错
就是给类一个别名吗?有其他用吗? 还是我没领悟到精髓呢?
@天天向上 最近在看「设计模式之禅」,其中讲到门面模式的优点
就是给类一个别名吗?通俗地说是的。Laravel Facades 实际是服务容器中底层类的 「静态代理」 ,相对于传统静态方法,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。我觉得 文档 已经讲的挺明白的了。 :see_no_evil:
:wink: