illuminate/database 使用 二

上一篇文章写怎么单独使用illuminate/database,这回讲下怎么整合到项目里使用。为此特意看了下laravel对其使用。本篇文章,参照laravel的使用,简单实现。

一 原理

laravel 里使用illuminate/config。

illuminate/config composer 地址:illuminate/config - Packagist

illuminate/config github 地址:GitHub - illuminate/config: READ ONLY Subtree split of the Illuminate Config component (see laravel/framework)

根据 illuminate/config 源码显示 illuminate/config/Repository.php 仅继承Illuminate\Contracts\Config\Repository,没有其他操作。

所以编写Myconfig.php相同代码,没有加入 illuminate/config。也可以直接执行命令添加。

php 复制代码
composer require illuminate/config:版本

通过查看laravel源码,发现先加入容器,再重写容器中绑定的对象。

之所以不能直接绑定操作后的对象,因为bind()、bindIf()等相关方法中,被绑定的数据不能传对象,而instance()没有此限制,所以能传设置参数后的对象。

数据库管理对象构造传入容器对象,会自动获取config对应参数。之后可以直接查询。

例子里对于设置容器后,处理配置文件的流程与laravel不同。laravel中更复杂也更完善。

二 代码

目录结构

  • test.php

  • config/database.php

  • Myconfig.php

php 复制代码
//test.php
require_once './vendor/autoload.php';
require_once './Myconfig.php';

use Illuminate\Container\Container;
use Illuminate\Database\Capsule\Manager as DbManager;
use Illuminate\Events\Dispatcher;

class Loader
{
    private $container;
    public function __construct(Container $container)
    {
        $this->container = $container;
        $this->makes();
    }

    private function get_makes_list()
    {
        $list = [
            'config' => Myconfig::class,
        ];
        return $list;
    }
    private function makes()
    {
        $list = $this->get_makes_list();
        foreach ($list as $key => $value) {

            $this->container->bindIf($key, $value);
        }
    }
    public function get_path_list($name)
    {
        $list = [
            'config' => "./config",
        ];
        return $list[$name] ? $list[$name] : false;
    }
}

class App
{
    private $container;
    private $loader;
    public function __construct()
    {
        $this->container = new Container();
        $this->loader = new Loader($this->container);
        $this->init();
    }
    public function init()
    {
        $this->init_config();
        $this->init_db();
    }
    private function init_config()
    {
        $config_list = [];
        $config_path = $this->loader->get_path_list('config');
        if ($files_list = opendir($config_path)) {
            while (($file = readdir($files_list)) != false) {
                if (!preg_match('/(.*).php/', $file, $matches)) {
                    continue;
                }
                $data = include $config_path . "/" . $file;
                if (!is_array($data)) {
                    continue;
                }
                $file_name = $matches[1];
                foreach ($data as $key => $value) {
                    $list_key = $file_name . "." . $key;
                    $config_list[$list_key] = $value;
                }
            }
        }
        if (!empty($config_list)) {
            $myconfig = new Myconfig($config_list);
            $this->container->instance('config', $myconfig);
        }
    }
    private function init_db()
    {
        $dbm = new DbManager($this->container);
        $dbm->setEventDispatcher(new Dispatcher(new Container));
        $dbm->setAsGlobal(); //设置静态全局可用
        $dbm->bootEloquent();
    }
}

function test()
{
    new App();
    $info = DbManager::table('userinfo')->where('id', '=', 2)->get();
    var_dump($info);
}

test();
php 复制代码
//./config/database.php
return [
    'migrations' => '', //数据迁移
    //PDO文档 https://www.php.net/manual/zh/pdo.constants.php
    'fetch' => PDO::FETCH_OBJ,
    'default' => 'master',
    'connections' => [
        'master' => [
            'driver' => 'mysql',
            'host' => 'localhost',
            'database' => 'test',
            'username' => 'root',
            'password' => 'qwe110110',
            'charset' => 'utf8',
            'collation' => 'utf8_general_ci',
            'prefix' => '',
        ],
        'test' => [
            "driver" => "mysql",
            "host" => "127.0.0.1",
            "database" => "brook3_master",
            "username" => "root",
            "password" => "root",
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
        ],
    ],
];
php 复制代码
//./Myconfig.php
use Illuminate\Contracts\Config\Repository as ConfigContract;
use Illuminate\Support\Arr;

class Myconfig implements ConfigContract, ArrayAccess
{
    /**
     * All of the configuration items.
     *
     * @var array
     */
    protected $items = [];

    /**
     * Create a new configuration repository.
     *
     * @param  array  $items
     * @return void
     */
    public function __construct(array $items = [])
    {
        $this->items = $items;
    }

    /**
     * Determine if the given configuration value exists.
     *
     * @param  string  $key
     * @return bool
     */
    public function has($key)
    {
        return Arr::has($this->items, $key);
    }

    /**
     * Get the specified configuration value.
     *
     * @param  array|string  $key
     * @param  mixed  $default
     * @return mixed
     */
    public function get($key, $default = null)
    {
        if (is_array($key)) {
            return $this->getMany($key);
        }

        return Arr::get($this->items, $key, $default);
    }

    /**
     * Get many configuration values.
     *
     * @param  array  $keys
     * @return array
     */
    public function getMany($keys)
    {
        $config = [];

        foreach ($keys as $key => $default) {
            if (is_numeric($key)) {
                [$key, $default] = [$default, null];
            }

            $config[$key] = Arr::get($this->items, $key, $default);
        }

        return $config;
    }

    /**
     * Set a given configuration value.
     *
     * @param  array|string  $key
     * @param  mixed  $value
     * @return void
     */
    public function set($key, $value = null)
    {
        $keys = is_array($key) ? $key : [$key => $value];

        foreach ($keys as $key => $value) {
            Arr::set($this->items, $key, $value);
        }
    }

    /**
     * Prepend a value onto an array configuration value.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function prepend($key, $value)
    {
        $array = $this->get($key, []);

        array_unshift($array, $value);

        $this->set($key, $array);
    }

    /**
     * Push a value onto an array configuration value.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function push($key, $value)
    {
        $array = $this->get($key, []);

        $array[] = $value;

        $this->set($key, $array);
    }

    /**
     * Get all of the configuration items for the application.
     *
     * @return array
     */
    public function all()
    {
        return $this->items;
    }

    /**
     * Determine if the given configuration option exists.
     *
     * @param  string  $key
     * @return bool
     */
    #[\ReturnTypeWillChange]
    public function offsetExists($key)
    {
        return $this->has($key);
    }

    /**
     * Get a configuration option.
     *
     * @param  string  $key
     * @return mixed
     */
    #[\ReturnTypeWillChange]
    public function offsetGet($key)
    {
        return $this->get($key);
    }

    /**
     * Set a configuration option.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    #[\ReturnTypeWillChange]
    public function offsetSet($key, $value)
    {
        $this->set($key, $value);
    }

    /**
     * Unset a configuration option.
     *
     * @param  string  $key
     * @return void
     */
    #[\ReturnTypeWillChange]
    public function offsetUnset($key)
    {
        $this->set($key, null);
    }
}
相关推荐
两个人的幸福5 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo7 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack7 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982078 天前
PHP 扩展——从入门到理解
php
鹏仔先生9 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下9 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip9 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒9 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2509 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis9 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel