Zend Expressive 配置管理器
2.1.1
2017-08-29 13:00 UTC
Requires
- php: >=7.0
- doctrine/annotations: ~1.2
- symfony/yaml: ~2.8 || ~3.0
Requires (Dev)
- phpunit/phpunit: ~6.0
- satooshi/php-coveralls: ~1.0.0
README
安装
Composer
安装此扩展的首选方式是通过 Composer.
运行以下命令之一
php composer.phar require zelenin/zend-expressive-config "~2.1.0"
或添加以下内容到您的 composer.json
的 require 部分
"zelenin/zend-expressive-config": "~2.1.0"
用法
配置提供者
- PHP
- Yaml
- 数组
- 集合
- 模块配置对象
示例
<?php use Zelenin\FooModule\Config\FooModuleConfig; use Zelenin\Zend\Expressive\Config\ConfigManager; use Zelenin\Zend\Expressive\Config\Provider\ArrayProvider; use Zelenin\Zend\Expressive\Config\Provider\CacheProvider; use Zelenin\Zend\Expressive\Config\Provider\PhpProvider; use Zelenin\Zend\Expressive\Config\Provider\YamlProvider; use Zelenin\Zend\Expressive\Config\Provider\AnnotationProvider; $productionMode = true; // environment variable $providers = [ new PhpProvider(__DIR__ . '/../config/autoload/*.global.php'), new PhpProvider(__DIR__ . '/../config/autoload/*.local.php'), new YamlProvider(__DIR__ . '/../config/autoload/*.global.yml'), new YamlProvider(__DIR__ . '/../config/autoload/*.local.yml'), new AnnotationProvider(__DIR__ . '/../src', __DIR__ . '/../data/cache/factories'), new ArrayProvider(['foo' => 'bar']), new FooModuleConfig(), ]; if ($productionMode) { $providers = [new CacheProvider(__DIR__ . '/../data/cache/app-config.php', $providers)]; } $manager = new ConfigManager($providers); $config = $manager->getConfig();
模块配置示例
namespace Zelenin\FooModule\Config; use Zelenin\Zend\Expressive\Config\Provider\ModuleConfigProvider; use Zelenin\Zend\Expressive\Config\Provider\CollectionProvider; use Zelenin\Zend\Expressive\Config\Provider\PhpProvider; use Zelenin\Zend\Expressive\Config\Provider\YamlProvider; final class FooModuleConfig extends ModuleConfigProvider { /** * @return array */ public function getConfig() { return [ 'foo' => 'bar' ]; // or return require_once 'fooModuleConfig.php'; // or return (new CollectionProvider([ new PhpProvider(__DIR__ . '/../Resources/config/*.global.php')), new PhpProvider(__DIR__ . '/../Resources/config/*.local.php')), new YamlProvider(__DIR__ . '/../Resources/config/*.global.yml')) new YamlProvider(__DIR__ . '/../Resources/config/*.local.yml')) ]))->getConfig(); } }
YAML 中的变量
您可以像以下示例那样解析变量。
配置
dependencies: factories: Zend\Stratigility\FinalHandler: 'Zend\Expressive\Container\TemplatedErrorHandlerFactory' Zend\Expressive\Template\TemplateRendererInterface: 'Zend\Expressive\Twig\TwigRendererFactory' twig: cache_dir: '%rootDir%/data/cache/twig' assets_url: '/' assets_version: 1 globals: [] extensions: [] templates: extension: 'html.twig' paths: application: - '%moduleRootDir%/Resources/views'
提供者
<?php declare(strict_types=1); namespace Zelenin\Application\Config; use ArrayObject; use Zelenin\Zend\Expressive\Config\Provider\CollectionProvider; use Zelenin\Zend\Expressive\Config\Provider\ModuleConfigProvider; use Zelenin\Zend\Expressive\Config\Provider\YamlProvider; final class Provider extends ModuleConfigProvider { /** * @return array */ public function getConfig(): array { return $this->resolveVariables( (new CollectionProvider([ new YamlProvider(__DIR__ . '/../Resources/config/*.global.yml'), new YamlProvider(__DIR__ . '/../Resources/config/*.local.yml'), ]))->getConfig() ); } /** * @param array $config * * @return array */ private function resolveVariables(array $config): array { $variableRegistry = $this->getVariablesRegistry(); array_walk_recursive($config, function (&$value, $key) use ($variableRegistry) { if (is_string($value)) { if (preg_match('/%(.+)%/', $value, $matches)) { $variable = $matches[1]; if (isset($variableRegistry[$variable])) { $value = preg_replace('/%(.+)%/', $variableRegistry[$variable], $value); } } } }); return $config; } /** * @return array */ private function getVariablesRegistry(): array { return [ 'rootDir' => realpath(__DIR__ . '/../../..'), 'moduleRootDir' => realpath(__DIR__ . '/..'), ]; } }
注解
支持的注解
@Factory(id=Service::class)
@Invokable(id=InvokableService::class)
@Inject
@Middleware(path="/path")
@Route(path="/path", methods={"GET", "POST"}, name="route-name")
注意: @Middleware
和 @Route
仅与 programmatic_pipeline=false
一起使用
用法:请参阅 测试 中的示例