上一篇文章写怎么单独使用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。也可以直接执行命令添加。
composer require illuminate/config:版本
通过查看laravel源码,发现先加入容器,再重写容器中绑定的对象。
之所以不能直接绑定操作后的对象,因为bind()、bindIf()等相关方法中,被绑定的数据不能传对象,而instance()没有此限制,所以能传设置参数后的对象。
数据库管理对象构造传入容器对象,会自动获取config对应参数。之后可以直接查询。
例子里对于设置容器后,处理配置文件的流程与laravel不同。laravel中更复杂也更完善。
目录结构
- test.php
- config/database.php
- Myconfig.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();
-
- //./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' => '',
- ],
- ],
- ];
- //./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);
- }
- }