Laravel集成Yaconf扩展

前言#

Yaconf 扩展是大神鸟哥的作品,下面将讲解如何集成到 Laravel。

环境#

php 版本:7.2.6
Laravel 版本:7.30.6

具体步骤#

Laravel 有两个访问入口,一个是通过访问 public/index.php,另一个则是通过命令行访问 php artisan,所以需要改动两个加载配置的地方。分别是:
app/Http/Kernel.php 和 app/Console/Kernel.php,将两个类在父类中 $bootstrappers 属性覆盖成我们自定义的配置加载类。如下图:

首先安装 yaconf 扩展,这部分可自行百度完成。
然后在 php.ini 中配置存放配置文件的目录下,将项目 config 目录下的各个配置文件按照 yaconf 能读取的格式转成类似 app.ini、auth.ini 等。下面是 app.ini 部分配置内容 (适用于 beta 环境):

[beta]
name=Laravel
env=beta
debug=false
url="http://test.com"
asset_url="http://test.com"
timezone=PRC
local=en
fallback_local=en
faker_local=en_US
key="base64:kmC2L0ZjhkzZJdDmtrAqT4T1z2od3Ty/3tV9oWDitMI="
cipher="AES-256-CBC"
providers.0="Illuminate\Auth\AuthServiceProvider"
providers.1="Illuminate\Broadcasting\BroadcastServiceProvider"
providers.2="Illuminate\Bus\BusServiceProvider"
providers.3="Illuminate\Cache\CacheServiceProvider"
providers.4="Illuminate\Foundation\Providers\ConsoleSupportServiceProvider"
providers.5="Illuminate\Cookie\CookieServiceProvider"
providers.6="Illuminate\Database\DatabaseServiceProvider"
providers.7="Illuminate\Encryption\EncryptionServiceProvider"
providers.8="Illuminate\Filesystem\FilesystemServiceProvider"
providers.9="Illuminate\Foundation\Providers\FoundationServiceProvider"
providers.10="Illuminate\Hashing\HashServiceProvider"
providers.11="Illuminate\Mail\MailServiceProvider"
providers.12="Illuminate\Notifications\NotificationServiceProvider"
providers.13="Illuminate\Pagination\PaginationServiceProvider"
providers.14="Illuminate\Pipeline\PipelineServiceProvider"
providers.15="Illuminate\Queue\QueueServiceProvider"
providers.16="\App\Providers\DeferServiceProvider"
providers.17="Illuminate\Auth\Passwords\PasswordResetServiceProvider"
providers.18="Illuminate\Session\SessionServiceProvider"
providers.19="Illuminate\Translation\TranslationServiceProvider"
providers.20="Illuminate\Validation\ValidationServiceProvider"
providers.21="Illuminate\View\ViewServiceProvider"
providers.22="App\Providers\AppServiceProvider"
providers.23="App\Providers\AuthServiceProvider"
providers.24="App\Providers\EventServiceProvider"
providers.25="App\Providers\RouteServiceProvider"

.env 文件中增加配置项,指明要读取的配置文件名

YACONF_FILES=app,auth,broadcasting,cache,cors,database,filesystems,hashing,logging,mail,queue,services,session,view

这时我们就可以写自定义的配置加载类了。

<?php
namespace App\Http\Services\Lib;

use Illuminate\Config\Repository;
use Illuminate\Contracts\Foundation\Application;

class LoadConfiguration
{
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        $items = $this->loadConfigurationYaconfFiles();
        // Next we will spin through all of the configuration files in the configuration
        // directory and load each one into the repository. This will make all of the
        // options available to the developer for use in various parts of this app.
        $app->instance('config', $config = new Repository($items));

        // Finally, we will set the application's environment based on the configuration
        // values that were loaded. We will pass a callback which will be used to get
        // the environment in a web context where an "--env" switch is not present.
        $app->detectEnvironment(function () use ($config) {
            return $config->get('app.env', 'production');
        });

        date_default_timezone_set($config->get('app.timezone', 'UTC'));

        mb_internal_encoding('UTF-8');
    }

    /**
     * Load the configuration items from all of the yaconf files.
     *
     * @return array
     */
    protected function loadConfigurationYaconfFiles() {
        $env = env('APP_ENV', 'test');
        $config_files = explode(',', env('YACONF_FILES', ''));
        $result = [];
        foreach ($config_files as $config_file) {
            $result[$config_file] = \Yaconf::get($config_file.'.'.$env);
        }
        return $result;
    }
}

最后,分别在 app/Http/Kernel.php 和 app/Console/Kernel.php 替换成我们自定义的类:

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The bootstrap classes for the application.
     *
     * @var array
     */
    protected $bootstrappers = [
        \Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class,
        //\Illuminate\Foundation\Bootstrap\LoadConfiguration::class,
        //自定义配置加载类
        \App\Http\Services\Lib\LoadConfiguration::class,
        \Illuminate\Foundation\Bootstrap\HandleExceptions::class,
        \Illuminate\Foundation\Bootstrap\RegisterFacades::class,
        \Illuminate\Foundation\Bootstrap\RegisterProviders::class,
        \Illuminate\Foundation\Bootstrap\BootProviders::class,
    ];

测试如果报错,则需要检查.ini 配置文件中的格式是否正确。

参考#

一起了解 PHP 中 YaConf 扩展的使用

总结#

不满足于当下,追求更多可能。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2
fatrbaby

这样就不符合 12factor 设计标准了。

2年前 评论
milksoul (楼主) 2年前