PHP手寫MVC (四)—— 配置

一般一個框架會提供一種獲取配置文件的操做類,該類的做用是,加載用戶自定義配置文件,讀取和設置配置文件等操做。php

咱們規定用戶配置文件目錄爲 origin/app/conf,在該目錄下,config.php 是默認的配置文件,此外,還能夠在該目錄下建立其餘配置文件,例如 db.phpserver.php 等,全部其餘文件也會被自動加載。mysql

定義規則

配置文件內容直接返回數組。示例redis

app/conf/config.phpsql

<?php
return [
    'default' => [
        'controller' => 'index',
        'action' => 'index',
        'router' => 'querystring',
    ],
    'debug' => true,
    'cache' => 'redis',
];

app/conf/db.php數組

<?php
return [
    'mysql' => [
        'host'      => '127.0.0.1',
        'username'  => '',
        'password'  => '',
        'db'        => '',
        'port'      => 3306,
        'charset'   => 'utf8',
        'prefix'    => ''
    ],
    'redis' => [
        'scheme' => '',
        'host'   => '',
        'port'   => '',
    ]
];

使用規則

經過 Config::get($key) 來獲取配置。app

  • config.php 做爲默認配置文件能夠直接獲取該配置文件內容,多維數組經過.分隔,例如
<?php

Config::get('debug');
Config::get('default.route');
  • db.php 或其餘自定義配置文件,須要添加文件名前綴,例如
<?php

Config::get('db.mysql.host');
Config::get('db.redis.scheme');

Config 類

Config 類主要實現如下功能:框架

  • 加載用戶配置文件
<?php

namespace core;

use dispatcher\Container;

class Config extends Container
{
    private $conf;
    
    public function __construct()
    {
        $conf = [];
        $path = APP_PATH.'/app/conf/';
        foreach (scandir($path) as $file) {
            if (substr($file,-4) != '.php') {
                continue;
            }
            $filename = $path.$file;
            
            if ($file == 'config.php') {
                //1
                $conf += require $filename;
            } else {
                //2
                $k = explode('.', $file)[0];
                $conf[$k] = require $filename;
            }
        }
        $this->conf = $conf;
    }

因爲繼承 Container,構造函數只執行一次,所以在 __construct() 中加載配置文件能夠避免重複加載。函數

除了 config.php 外的其餘配置文件,須要用文件名做爲 keyui

  • 解析多維 key 和使用默認值
//1
protected function get($key = null, $default=null)
{
    //2
    if (empty($key)) {
        return $this->conf;
    }
    //3
    if (strpos($key, '.')) {
        $conf = $this->conf;
        foreach (explode('.', $key) as $k) {
            $conf = $conf[$k] ?? $default;
        }
        return $conf;
    }
    //4
    return $this->conf[$key] ?? $default;
}
  1. 使用 :: 執行方法時,該方法須要聲明爲 protected,如 Config::get($key);
  2. 若是 $key 爲空,則返回全部配置。
  3. 經過 . 來解析多維數組配置。
  4. 若是爲找到對應值,根據是否設置默認值返回結果。
相關文章
相關標籤/搜索