前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >制作一个PHP简易框架(八)-- 配置中心

制作一个PHP简易框架(八)-- 配置中心

作者头像
caoayu
发布2021-03-03 15:02:50
9650
发布2021-03-03 15:02:50
举报
文章被收录于专栏:caoayu的分享caoayu的分享
code
code

配置中心

对于一个需要灵活更改配置的项目来说,配置中心是必不可缺的一个功能。它可以帮我们统一管理配置项,降低了更改配置时对系统造成误操作的风险。

安装

同样使用开发包来集成这个服务。项目地址:https://github.com/hassankhan/config

代码语言:javascript
复制
composer require hassankhan/config

使用

首先将配置服务注册到容器中,方便我们使用容器来管理。创建 CacheServiceProvider.php

代码语言:javascript
复制
# app/Providers/CacheServiceProvider.php
<?php

namespace App\Providers;
use League\Container\ServiceProvider\AbstractServiceProvider;
use Noodlehaus\Config;
class ConfigServiceProvider extends AbstractServiceProvider
{
    protected $provides = [
        'config'
    ];

    public function register()
    {
        $container = $this->getContainer();
        $container->add('config',new Config(base_path('config')));
    }
}

添加到容器中

代码语言:javascript
复制
# bootstrap/core/container.php
$container->addServiceProvider(new \App\Providers\ConfigServiceProvider());

新建配置目录及配置文件,来测试配置是否开启成功

代码语言:javascript
复制
# config/app.php
<?php

return [
    'name' => 'caoayu',
    'debug' => true
];

代码语言:javascript
复制
# config/cache.php
<?php

return [
    'enable' => true,
    'twig' => [
        'cache_enable' => false,

    ]
];

对配置信息的引用,测试使用

代码语言:javascript
复制
# app/Controllers/HomeController.php
<?php

namespace App\Controllers;

class HomeController
{
    public function index($request)
    {
        $name = app('config')->get('name');
        return view('index.twig', compact('name'));
    }
}

打开浏览器,app.php 中配置的 name 渲染成功说明流程没有问题

定义缓存助手函数更方便的获取配置信息
代码语言:javascript
复制
# helpers.php
if (!function_exists('config')) {
    function config($key = '')
    {
        return app('config')->get($key);
    }
}
自定义是否使用页面缓存

修改视图的服务提供者

代码语言:javascript
复制
# app/Providers/ViewServiceProvider.php
<?php

namespace App\Providers;

use League\Container\ServiceProvider\AbstractServiceProvider;

class ViewServiceProvider extends AbstractServiceProvider
{
    protected $viewPath;
    protected $cachePath;
    protected $provides = [
        'twig'
    ];

    public function __construct()
    {
        $this->viewPath = base_path('resources/views');
        $this->cachePath = base_path('storage/views');
    }

    public function register()
    {
        $container = $this->getContainer();
        $container->add('twig', function () {
            $loader = new \Twig\Loader\FilesystemLoader($this->viewPath);

            $twig = new \Twig\Environment($loader, [
                'cache' => config('twig.cache_enable') ? $this->cachePath : false, # 使用注册的全局助手函数获取配置信息
            ]);
            return $twig;
        });
    }
}

register 中的 cache 中判断是否配置开启了缓存服务。

修改视图文件,如果没有改变则说明已经被缓存成功。第一次访问时由于开启缓存并且找不到缓存,是会发生更改,当缓存文件生成后在修改就不会看到更改了,缓存文件会生成在 storage/view 目录中。

对容器内的服务使用配置方式注册

如果每次添加一个服务提供者,我们都要更改 container.php 的内容,那么对于不熟悉这个模块的开发者来说可能会误操作引起系统的崩溃,所以,将这块加入配置中,来减少外部对容器服务的更改是非常有必要的。

首先在 config/app.php 中定义所有要注册的服务。

代码语言:javascript
复制
# config/app.php
'providers' => [
        App\Providers\AppServiceProvider::class,
        App\Providers\ViewServiceProvider::class
    ]

container.php 文件中遍历所有的服务并注册进去

代码语言:javascript
复制
# bootstrap/core/container.php
<?php

$container = new League\Container\Container;

$container->addServiceProvider(new App\Providers\ConfigServiceProvider());

$GLOBALS['container'] = $container;

foreach(config('providers') as $provider){
    $container->addServiceProvider($provider);
}

配置信息的隐私问题–引入ENV

在项目中,有些配置是私人的,比如密钥。或者一些配置是动态更改的,每个人的环境可能不同,所以就需要使用一个另外的方式来保存配置,这个方式我们使用 .env 文件来做。类似与使用每个机器的环境变量。这个文件一般在代码的版本管理中是被忽略上传的。如 git svn coding gitee 等。

安装开发包

项目地址:https://github.com/vlucas/phpdotenv

代码语言:javascript
复制
composer require vlucas/phpdotenv
使用

创建 env 服务。在 bootstrap/core 下创建 env.php

代码语言:javascript
复制
# bootstrap/core/env.php
<?php

try {
    $dotenv = Dotenv\Dotenv::createUnsafeImmutable(base_path());
    $dotenv->load();
}catch (\Dotenv\Exception\InvalidPathException $exception){
    dump('env path invaild');
}

bootstrap/app.php 中引用

代码语言:javascript
复制
# bootstrap/app.php
require_once base_path('bootstrap/core/env.php'); # 注意这个引用要防止自动加载文件之下,也就是自动加载后第一个加载的文件,防止 env 服务未初始化完成就调用
定义助手函数来方便定义默认值

由于 env 中的值都会解析为字符串,所以进行转换,并去除两边的引号

代码语言:javascript
复制
# helpers.php
if (!function_exists('env')) {
    function env($key, $default = null)
    {
        $value = getenv($key,true)?:getenv($key);
        switch ($value) {
            case "true":
                return true;
            case "false":
                return false;
            case "":
                return $default;
            case "null":
                return null;
            default :
                $valueLength = strlen($value);
                if (strlen($value) > 1 && $value[0] === '"' && $value[$valueLength - 1] === '"') {
                    return substr($value, 1, -1);
                }
                return $value;
        }

    }
}
调用

例如在 conifg/cache.php

代码语言:javascript
复制
# config/cache.php
<?php

return [
    'enable' => true,
    'twig' => [
        'cache_enable' => env('APP_CACHE',false),
    ]
];

这样将配置分为两层可以更灵活的控制配置的值,也更加隔离,减少不必要的更改。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 配置中心
  • 安装
  • 使用
    • 定义缓存助手函数更方便的获取配置信息
      • 自定义是否使用页面缓存
      • 对容器内的服务使用配置方式注册
      • 配置信息的隐私问题–引入ENV
        • 安装开发包
          • 使用
            • 定义助手函数来方便定义默认值
              • 调用
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档