如何在 Laravel 项目中创建自己的 Facade

Laravel

通过这篇文章,我们可以学会如何定义自己的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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://dev.to/azibom/define-your-own-fa...

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

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
running8

明白了Facade的来龙去脉

6个月前 评论
自由与温暖是遥不可及的梦想

瞬间 明白吗 门面到底是个什东西 自己应该怎么去写,什么服务容器什么的都可以出这样的教程 一下子就明白了 非常不错

6个月前 评论

就是给类一个别名吗?有其他用吗? 还是我没领悟到精髓呢?

6个月前 评论

@天天向上 最近在看「设计模式之禅」,其中讲到门面模式的优点

  • 减少系统的相互依赖
  • 提高了灵活性
  • 提高安全性

就是给类一个别名吗?通俗地说是的。Laravel Facades 实际是服务容器中底层类的 「静态代理」 ,相对于传统静态方法,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。我觉得 文档 已经讲的挺明白的了。 :see_no_evil:

6个月前 评论
刘天承

:wink:

4个月前 评论

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