• Laravel5 创建自定义门面(Facade)


     

    门面为应用服务容器中的绑定类提供了一个“静态”接口。Laravel 内置了很多门面,你可能在不知道的情况下正在使用它们。Laravel 的门面作为服务容器中底层类的“静态代理”,相比于传统静态方法,在维护时能够提供更加易于测试、更加灵活、简明优雅的语法。所谓门面就是 Facade 类利用了 __callStatic() 魔术方法来延迟调用容器中的对象的方法

    接下来使用 Laravel 编写一个自定义门面


    首先创建一个需要绑定到服务容器的 TokenManageService 类

    declare(strict_types=0);
    
    /**
     * app/Services/TokenMangeService.php
     *
     */
    namespace AppServices;
    
    /**
     * Token管理服务
     *
     * Class TokenManageService
     * @package AppServices
     */
    class TokenManageService
    {
        /**
         * 定义token属性
         *
         * @var
         */
        public $token;
    
        /**
         * 定义token属性
         *
         * @param $token
         * @return mixed
         */
        public function getToken($token)
        {
            return $this->token = $token;
        }
    }

    创建一个静态指向 TokenManage 类的门面类 TokenManageFacade

    declare(strict_types=0);
    
    /**
     * app/Facades/TokenManageFacade.php
     *
     */
    namespace AppFacades;
    
    use IlluminateSupportFacadesFacade;
    
    /**
     * Class TokenManageFacade
     * @package AppFacades
     */
    class TokenManageFacade extends Facade
    {
        /**
         * Get the registered name of the component.
         *
         * @return string
         */
        protected static function getFacadeAccessor()
        {
            return 'token.manage';
        }
    }

    在服务提供者中绑定 TokenManageService 类到服务容器

    declare(strict_types=0);
    
    /**
     * app/Providers/TokenManageServiceProvider.php
     *
     */
    namespace AppProviders;
    
    use AppServicesTokenManageService;
    
    use IlluminateSupportServiceProvider;
    
    /**
     * token管理服务提供者
     *
     * Class TokenManageServiceProvider
     * @package AppProviders
     */
    class TokenManageServiceProvider extends ServiceProvider
    {
    
        /**
         * Define your route model bindings, pattern filters, etc.
         *
         * @return void
         */
        public function boot()
        {
        }
    
        /**
         * Register the application services.
         *
         * @return void
         */
        public function register()
        {
            $this->app->singleton('token.manage', function ($app) {
                return new TokenManageService();
            });
        }
    }

    修改配置文件 config/app.php

    return [
        'providers' => [
            ...
            /**
             * 自定义
             */
            AppProvidersTokenManageServiceProvider::class
        ],
        'aliases' => [
            ...
            /**
             * 自定义
             */
            'TokenManage' => AppFacadesTokenManageFacade::class
        ],
    ]

    接下来就可以测试了

    declare(strict_types=0);
    
    /**
     * TestController.php.
     *
     */
    namespace AppHttpControllersTest;
    
    use TokenManage;
    
    /**
     * Class TestController
     * @package AppHttpControllersTest
     */
    class TestController extends Controller
    {
        /**
         * 测试自定义门面
         */
        public function testFacade()
        {
            $res = TokenManage::getToken('Hello World');
            dd($res);
        }
    }

    Response

    Class 'TokenManage' Not Found
    • 1
    • WTF,当时心里一万只草泥马奔腾着,why…why…why…

    • 没办法啦,只能定位问题了,默默地找了定位了半个多小时,终于发现了问题所在,原来是 Laravel 的配置文件有缓存没有更新到。

    php artisan config:cache
    • 1

    重新测试一下,果然成功了。

    Response

    'Hello World'
  • 相关阅读:
    浅出Java Socket 编程
    WPF指南之一(WPF的结构)
    使用URL访问网络资源
    WPF指南之三(XAML的名字空间)
    多线程并发思考文件加锁
    关于kindeditor上传图片出现"服务器发生故障"的解决办法
    isset function of PHP
    JSON字符串传到后台PHP处理的问题
    isset function of PHP
    (转)Linux利器 strace
  • 原文地址:https://www.cnblogs.com/brady-wang/p/10537497.html
Copyright © 2020-2023  润新知