系统配置

Testing Is Documentation

tests/Option/OptionTest.php系统配置 - 图1

QueryPHP 为系统提供了灵活的配置,通常来说通过服务提供者将配置打包到服务容器中,可以很方便地使用。

使用方式

使用容器 option 服务

  1. \App::make('option')->set($name, $value = null): void;
  2. \App::make('option')->get(string $name = 'app\\', $defaults = null);

依赖注入

  1. class Demo
  2. {
  3. private \Leevel\Option\IOption $option;
  4. public function __construct(\Leevel\Option\IOption $option)
  5. {
  6. $this->option = $option;
  7. }
  8. }

使用静态代理

  1. \Leevel\Option\Proxy\Option::set($name, $value = null): void;
  2. \Leevel\Option\Proxy\Option::get(string $name = 'app\\', $defaults = null);

配置目录

系统配置文件为 option 目录,每个配置文件对应不同的组件,当然你也可以增加自定义的配置文件。

  • 配置位于 option,可以定义配置文件。
  • 主要配置文件包含应用、数据库、缓存、日志、Session 等等。
  • 扩展配置 common/ui/option/test.php 目录,在 composer.json 中定义。

composer.json 可以扩展目录

  1. {
  2. "extra": {
  3. "leevel": {
  4. "@options": "The extend options",
  5. "options": {
  6. "test": "common/ui/option/test.php"
  7. }
  8. }
  9. }
  10. }

WARNING

注意,其它软件包也可以采用这种方式自动注入扩展默认配置。

系统默认常见配置:

配置项配置描述
app应用配置
auth登陆验证
cache缓存配置
console控制台配置
cookieCookie 配置
database数据库配置
debug调试配置
filesystem文件系统配置
i18n国际化配置
log日志配置
mail邮件配置
protocolSwoole 配置
sessionSession 配置
throttler限流配置
view视图配置

配置缓存

配置支持生成缓存,通过内置的命令即可实现。

  1. php leevel option:cache

返回结果

  1. Start to cache option.
  2. Option cache file /data/codes/queryphp/bootstrap/option.php cache successed.

清理配置缓存

  1. php leevel option:clear

返回结果

  1. Start to clear cache option.
  2. Option cache file /data/codes/queryphp/bootstrap/option.php cache clear successed.

配置定义

可以直接在相应的配置文件已数组的方式定义,新的配置文件直接放入目录即可。

TIP

配置参数名严格区分大小写,建议是使用小写定义配置参数的规范。

app 应用配置中几个核心的配置项,这是整个系统关键的配置。

配置项配置值描述
environmentdevelopment运行环境,可以为 production : 生产环境 testing : 测试环境 development : 开发环境
debugtrue是否打开调试模式,可以为 true : 开启调试 false 关闭调试,打开调试模式可以显示更多精确的错误信息。
auth_key7becb888f518b20224a988906df51e05安全 key,请妥善保管此安全 key,防止密码被人破解。

环境变量定义

可以在应用的根目录下定义一个特殊的 .env 环境变量文件,一般用于平时开发使用。

自定义环境变量

可以通过 RUNTIME_ENVIRONMENT 来定义自定义的环境变量文件,比如定义 .test 的环境变量。

  1. putenv('RUNTIME_ENVIRONMENT=test');

环境变量配置格式

  1. # Environment production、testing and development
  2. ENVIRONMENT = development
  3. # Debug
  4. DEBUG = true
  5. DEBUG_JSON = true
  6. DEBUG_CONSOLE = true
  7. DEBUG_JAVASCRIPT = true
  8. ...

获取环境配置

  1. \env('environment');
  2. \Leevel::env('environment');
  3. \App::env('environment');

Uses

  1. <?php
  2. use Leevel\Option\Option;

all 返回所有配置

  1. public function testAll(): void
  2. {
  3. $data = [
  4. 'hello' => 'world',
  5. 'test\\child' => ['foo' => 'bar'],
  6. ];
  7. $option = new Option($data);
  8. $this->assertSame($option->all(), $data);
  9. }

get 获取配置

  1. public function testGet(): void
  2. {
  3. $data = [
  4. 'app' => [
  5. 'environment' => 'testing',
  6. 'debug' => true,
  7. ],
  8. 'cache' => [
  9. 'expire' => 86400,
  10. 'time_preset' => [
  11. 'foo' => 'bar',
  12. ],
  13. ],
  14. 'hello' => 'world',
  15. ];
  16. $option = new Option($data);
  17. $this->assertSame('testing', $option->get('app\\environment'));
  18. $this->assertSame('testing', $option->get('environment'), 'Default namespace is app, so it equal app\\testing.');
  19. $this->assertNull($option->get('hello'), 'The default namespace is app, so it equal app\\hello');
  20. $this->assertNull($option->get('app\\hello'), 'The default namespace is app, so it equal app\\hello');
  21. $this->assertSame($option->get('hello\\'), 'world');
  22. $this->assertSame($option->get('hello\\*'), 'world');
  23. $this->assertSame([
  24. 'environment' => 'testing',
  25. 'debug' => true,
  26. ], $option->get('app\\'));
  27. $this->assertSame([
  28. 'environment' => 'testing',
  29. 'debug' => true,
  30. ], $option->get('app\\*'));
  31. $this->assertFalse([
  32. 'environment' => 'testing',
  33. 'debug' => true,
  34. ] === $option->get('app'), 'The default namespace is app, so it equal app\\app');
  35. // namespace\sub.sub1.sub2
  36. $this->assertSame($option->get('cache\\time_preset.foo'), 'bar');
  37. $this->assertNull($option->get('cache\\time_preset.foo2'));
  38. }

has 是否存在配置

  1. public function testHas(): void
  2. {
  3. $data = [
  4. 'app' => [
  5. 'environment' => 'testing',
  6. 'debug' => true,
  7. ],
  8. 'cache' => [
  9. 'expire' => 86400,
  10. 'time_preset' => [
  11. 'foo' => 'bar',
  12. ],
  13. ],
  14. 'hello' => 'world',
  15. ];
  16. $option = new Option($data);
  17. $this->assertTrue($option->has('app\\environment'));
  18. $this->assertTrue($option->has('environment'), 'Default namespace is app, so it equal app\\testing.');
  19. $this->assertFalse($option->has('hello'), 'The default namespace is app, so it equal app\\hello');
  20. $this->assertFalse($option->has('app\\hello'), 'The default namespace is app, so it equal app\\hello');
  21. $this->assertTrue($option->has('hello\\'));
  22. $this->assertTrue($option->has('hello\\*'));
  23. $this->assertTrue($option->has('app\\'));
  24. $this->assertTrue($option->has('app\\*'));
  25. $this->assertFalse($option->has('app'), 'The default namespace is app, so it equal app\\app');
  26. // namespace\sub.sub1.sub2
  27. $this->assertTrue($option->has('cache\\time_preset.foo'));
  28. $this->assertFalse($option->has('cache\\time_preset.foo2'));
  29. }

set 设置配置

  1. public function testSet(): void
  2. {
  3. $data = [];
  4. $option = new Option($data);
  5. // set app\environment value
  6. $option->set('environment', 'testing');
  7. $this->assertSame('testing', $option->get('app\\environment'));
  8. $this->assertSame('testing', $option->get('environment'), 'Default namespace is app, so it equal app\\testing.');
  9. $this->assertNull($option->get('hello'), 'The default namespace is app, so it equal app\\hello');
  10. $option->set('hello', 'i am hello');
  11. $this->assertSame($option->get('hello'), 'i am hello', 'The default namespace is app, so it equal app\\hello');
  12. $this->assertSame($option->all(), [
  13. 'app' => [
  14. 'environment' => 'testing',
  15. 'hello' => 'i am hello',
  16. ],
  17. ]);
  18. // 当我们获取一个不存在的配置命名空间时,返回一个初始化的空数组
  19. // hello namespace not app\hello
  20. $this->assertSame($option->get('hello\\'), []);
  21. $this->assertSame($option->get('hello\\*'), []);
  22. $option->set('hello\\', ['foo' => ['sub' => 'bar']]);
  23. $this->assertSame($option->get('hello\\foo.sub'), 'bar');
  24. // namespace\sub.sub1.sub2
  25. $option->set('cache\\time_preset.foo', 'bar');
  26. $this->assertSame($option->get('cache\\time_preset.foo'), 'bar');
  27. $this->assertNull($option->get('cache\\time_preset.foo2'));
  28. }

delete 删除配置

  1. public function testDelete(): void
  2. {
  3. $data = [
  4. 'app' => [
  5. 'environment' => 'testing',
  6. 'debug' => true,
  7. ],
  8. 'cache' => [
  9. 'expire' => 86400,
  10. 'time_preset' => [
  11. 'foo' => 'bar',
  12. ],
  13. ],
  14. 'hello' => 'world',
  15. ];
  16. $option = new Option($data);
  17. $option->delete('debug');
  18. $this->assertSame($option->all(), [
  19. 'app' => [
  20. 'environment' => 'testing',
  21. ],
  22. 'cache' => [
  23. 'expire' => 86400,
  24. 'time_preset' => [
  25. 'foo' => 'bar',
  26. ],
  27. ],
  28. 'hello' => 'world',
  29. ]);
  30. $option->delete('cache\\time_preset.foo');
  31. $this->assertSame($option->all(), [
  32. 'app' => [
  33. 'environment' => 'testing',
  34. ],
  35. 'cache' => [
  36. 'expire' => 86400,
  37. 'time_preset' => [
  38. ],
  39. ],
  40. 'hello' => 'world',
  41. ]);
  42. // 删除命令空间会初始化该命名空间为空数组,不存在会创建一个空数组
  43. $option->delete('hello\\');
  44. $this->assertSame($option->all(), [
  45. 'app' => [
  46. 'environment' => 'testing',
  47. ],
  48. 'cache' => [
  49. 'expire' => 86400,
  50. 'time_preset' => [
  51. ],
  52. ],
  53. 'hello' => [],
  54. ]);
  55. $option->delete('world\\');
  56. $this->assertSame($option->all(), [
  57. 'app' => [
  58. 'environment' => 'testing',
  59. ],
  60. 'cache' => [
  61. 'expire' => 86400,
  62. 'time_preset' => [
  63. ],
  64. ],
  65. 'hello' => [],
  66. 'world' => [],
  67. ]);
  68. }

reset 重置配置

危险操作,一般没有必要调用。

  1. public function testReset(): void
  2. {
  3. $data = [
  4. 'hello' => 'world',
  5. ];
  6. $option = new Option($data);
  7. $this->assertSame($option->all(), [
  8. 'hello' => 'world',
  9. ]);
  10. // array
  11. $option->reset(['foo' => 'bar']);
  12. $this->assertSame($option->all(), [
  13. 'foo' => 'bar',
  14. ]);
  15. // set a namespace
  16. $option->reset('foo');
  17. $this->assertSame($option->all(), [
  18. 'foo' => [],
  19. ]);
  20. $option->reset('foo2');
  21. $this->assertSame($option->all(), [
  22. 'foo' => [],
  23. 'foo2' => [],
  24. ]);
  25. // reset all
  26. $option->reset();
  27. $this->assertSame($option->all(), []);
  28. }

数组访问配置对象

配置实现了 \ArrayAccess,可以通过以数组的方式访问配置对象,在服务提供者中经常运用。

  1. public function testArrayAccess(): void
  2. {
  3. $data = [
  4. 'app' => [
  5. 'environment' => 'testing',
  6. 'debug' => true,
  7. ],
  8. 'cache' => [
  9. 'expire' => 86400,
  10. 'time_preset' => [
  11. 'foo' => 'bar',
  12. ],
  13. ],
  14. 'hello' => 'world',
  15. ];
  16. $option = new Option($data);
  17. // get
  18. $this->assertSame($option['cache\\time_preset.foo'], 'bar');
  19. // remove
  20. unset($option['cache\\time_preset.foo']);
  21. $this->assertNull($option['cache\\time_preset.foo']);
  22. // set
  23. $option['cache\\foo'] = 'bar';
  24. $this->assertSame($option['cache\\foo'], 'bar');
  25. // has
  26. $this->assertTrue(isset($option['hello\\']));
  27. }