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);
    }
}
相关推荐
BingoGo2 小时前
PHP 内存管理 深入理解 PHP 的引用和垃圾回收
后端·php
As33100102 小时前
IDM 下载失败排查指南:全面解析与解决方案
开发语言·php·idm
林深时见鹿74917 小时前
使用k8s k3s kuboard 部署 php hyperf 框架
php
长城202417 小时前
从词源和输出生成等角度详细解析PHP中常用文件操作类函数
php·文件·函数·文件操作函数
长城202418 小时前
PHP如何使用JpGraph生成3D饼形图?
开发语言·php·jpgraph·3d饼形图
熬夜苦读学习1 天前
Reactor 反应堆模式
运维·服务器·网络·网络协议·http·智能路由器·php
小森林81 天前
分享一次Guzzlehttp上传批量图片优化的经历
后端·php
THMAIL1 天前
大模型0基础开发入门与实践:第11章 进阶:LangChain与外部工具调用
开发语言·langchain·php
分享点2 天前
Laravel 使用阿里云OSS S3 协议文件上传
阿里云·php·laravel
苏琢玉2 天前
订单号老是撞车?我写了个通用 PHP ID 生成器
php·composer