ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Yii 2 配置系统全解析:从配置数组到应用、组件与环境的深度实践

Yii 2 配置系统全解析:从配置数组到应用、组件与环境的深度实践 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本文以 Yii 2 框架的配置体系为主线系统讲解配置数组的格式规范、Yii::createObject()与Yii::configure()的底层工作原理、应用配置与组件配置的实战写法、配置文件拆分、默认配置依赖注入容器以及环境常量的切换策略。读完本文你将能够写出可维护、可复用、随环境自适应切换的 Yii 2 配置代码并理解配置从数组到对象实例化的完整调用链。配置在 Yii 2 中的角色配置Configuration是 Yii 2 中最普遍的技术手段之一无论创建新对象还是初始化已有对象都离不开配置。一份配置通常包含待创建对象的类名一组要赋给对象属性的初始值一组要挂载到对象事件上的事件处理器一组要附加到对象上的行为。下面的配置被用来创建并初始化一个数据库连接$config [ class yii\db\Connection, dsn mysql:host127.0.0.1;dbnamedemo, username root, password , charset utf8, ]; $db Yii::createObject($config);Yii::createObject()接收一个配置数组作为参数实例化配置中class指定的类对象实例化完成后配置中剩余的内容会用来初始化对象的属性、事件处理器和行为。如果你已经持有某个对象可以用Yii::configure()借助配置数组初始化它的属性Yii::configure($object, $config);注意此时配置数组中不应包含class元素因为对象已经存在无需再指定类名。配置格式详解配置的格式可以形式化地描述为[ class ClassName, propertyName propertyValue, on eventName $eventHandler, as behaviorName $behaviorConfig, ]其中各元素的含义如下键名作用说明class指定要创建对象的完整类名仅在通过Yii::createObject()创建新对象时使用propertyName指定命名属性的初始值键是属性名值是对应的初始值只有公共成员变量和由 getter/setter 定义的属性可以被配置on eventName指定要挂载到对象事件上的处理器数组键由事件名加上on前缀构成支持的处理器格式参见事件章节as behaviorName指定要附加到对象上的行为数组键由行为名加上as前缀构成值$behaviorConfig是用于创建该行为的配置它本身又是一份普通的配置下面是一个同时包含属性初始值、事件处理器和行为的完整示例[ class app\components\SearchEngine, apiKey xxxxxxxx, on search function ($event) { Yii::info(Keyword searched: . $event-keyword); }, as indexer [ class app\components\IndexerBehavior, // ... property init values ... ], ]源码视角on与as前缀是如何生效的从源码实现看on与as前缀的解析发生在对象属性赋值阶段。framework/base/Component.php 中的__set()魔术方法依次处理三类赋值存在setXxx()设置器时调用设置器完成属性赋值键以on开头时去掉前缀调用$this-on(...)挂载事件处理器键以as开头时去掉前缀调用$this-attachBehavior(...)附加行为——行为值可以是Behavior实例、闭包、行为类名也可以是行为配置数组内部通过Yii::createObject()实例化。因此Yii::configure()的赋值循环framework/BaseYii.php虽然在代码上只是简单的$object-$name $value;但当目标对象继承自yii\base\Component时on与as前缀会被__set()自动识别并路由到对应的事件挂载与行为附加逻辑。配置的使用场景配置在 Yii 2 中随处可见。本节重点介绍两种最主要的用法应用配置与组件Widget配置。应用配置应用的配置可能是 Yii 中最复杂的一类数组yii\web\Application拥有大量可配置的属性和事件更重要的是它的components属性可以接收一组子配置数组用来创建并注册到应用中的各个组件。下面是 Basic 项目模板应用配置文件的摘录$config [ id basic, basePath dirname(__DIR__), extensions require __DIR__ . /../vendor/yiisoft/extensions.php, components [ cache [ class yii\caching\FileCache, ], mailer [ class yii\symfonymailer\Mailer, ], log [ class yii\log\Dispatcher, traceLevel YII_DEBUG ? 3 : 0, targets [ [ class yii\log\FileTarget, ], ], ], db [ class yii\db\Connection, dsn mysql:hostlocalhost;dbnamestay2, username root, password , charset utf8, ], ], ];这份配置没有class键因为它的消费方是入口脚本类名已经确定(new yii\web\Application($config))-run();关于components属性的更多配置细节可参考应用与服务定位器两篇文章。从 2.0.11 版本起应用配置还支持通过container属性直接配置依赖注入容器$config [ id basic, basePath dirname(__DIR__), extensions require __DIR__ . /../vendor/yiisoft/extensions.php, container [ definitions [ yii\widgets\LinkPager [maxButtonCount 5] ], singletons [ // Dependency Injection Container singletons configuration ] ] ];definitions与singletons配置数组的取值方式和真实案例详见依赖注入容器一文中的 “Advanced Practical Usage” 小节。组件Widget配置使用组件Widget时经常需要通过配置来自定义组件属性。yii\base\Widget::widget()与yii\base\Widget::begin()都可以创建组件二者都接收配置数组use yii\widgets\Menu; echo Menu::widget([ activateItems false, items [ [label Home, url [site/index]], [label Products, url [product/index]], [label Login, url [site/login], visible Yii::$app-user-isGuest], ], ]);上述代码创建了一个Menu组件将activateItems属性初始化为false并配置了要展示的菜单项。注意因为类名已经确定这份配置数组不应包含class键。源码视角配置是如何被应用到对象上的Yii 2 对象的配置生效机制在两个层面协同工作入口层面Yii::createObject()framework/BaseYii.php支持字符串类名、可调用对象和数组三种形态当传入数组时它会取出class或__class键并将剩余部分作为初始化配置转交给依赖注入容器的get()方法。构造层面所有 Yii 对象的基类yii\base\BaseObjectframework/base/BaseObject.php约定构造函数最后一个参数为$config []并在构造函数末尾调用Yii::configure($this, $config)再执行init()。这意味着配置中的普通属性键、on前缀键、as前缀键在对象构造时就被一次性应用完毕。因此自定义类只要遵循“构造函数末尾调用parent::__construct($config)”的约定就能自动获得完整的配置初始化能力。配置文件当配置非常复杂时常见做法是把配置存放在一个或多个 PHP 文件中即配置文件。配置文件通过return语句返回一个代表配置的 PHP 数组。例如把应用配置保存在名为web.php的文件中return [ id basic, basePath dirname(__DIR__), extensions require __DIR__ . /../vendor/yiisoft/extensions.php, components require __DIR__ . /components.php, ];由于components配置本身也很复杂可以把它单独存放在components.php中并在web.php里用require引入。components.php的内容如下return [ cache [ class yii\caching\FileCache, ], mailer [ class yii\symfonymailer\Mailer, ], log [ class yii\log\Dispatcher, traceLevel YII_DEBUG ? 3 : 0, targets [ [ class yii\log\FileTarget, ], ], ], db [ class yii\db\Connection, dsn mysql:hostlocalhost;dbnamestay2, username root, password , charset utf8, ], ];获取配置文件中的配置同样简单直接require即可$config require path/to/web.php; (new yii\web\Application($config))-run();这种“拆分 require 组合”的模式让大型配置具备良好的可读性与可复用性例如多个入口web.php、console.php可以共享同一份components.php环境差异部分再单独覆盖。默认配置Yii::createObject()基于依赖注入容器实现。它允许你为指定类设定一组默认配置这些配置会在该类所有实例通过Yii::createObject()创建时自动生效。默认配置通常在引导bootstrapping代码中通过Yii::$container-set()指定。例如希望所有yii\widgets\LinkPager分页组件最多显示 5 个页码按钮默认值是 10可以这样设置\Yii::$container-set(yii\widgets\LinkPager, [ maxButtonCount 5, ]);如果不使用默认配置你不得不在每一个使用分页组件的地方重复配置maxButtonCount——默认配置机制正是为了消除这种重复。源码视角$container-set()做了什么Container::set()framework/di/Container.php将规范化后的定义存入_definitions同时清理掉已缓存的单例。normalizeDefinition()framework/di/Container.php支持多种定义形态空定义退化为[class $class]、字符串被当作类名、Instance对象取其 id、可调用对象与对象原样保留、数组则补全缺失的class键。与之配套的是Container::setSingleton()framework/di/Container.php它注册的定义每次get()都返回同一个实例。二者的差别正对应应用配置中container.definitions与container.singletons两个键的语义。当get()命中已注册定义时framework/di/Container.php若定义是数组则取出class后把剩余配置与调用方传入的配置合并再交给build()完成依赖解析与实例化——默认配置因此得以在“创建时”注入每一个实例。环境常量配置通常会随应用运行环境的不同而变化。例如开发环境使用名为mydb_dev的数据库生产环境则使用mydb_prod。为方便切换环境Yii 提供了常量YII_ENV你可以在应用的入口脚本中定义它defined(YII_ENV) or define(YII_ENV, dev);YII_ENV可取以下值prod生产环境。常量YII_ENV_PROD将求值为true。这是YII_ENV的默认值如果你不定义它。dev开发环境。常量YII_ENV_DEV将求值为true。test测试环境。常量YII_ENV_TEST将求值为true。利用这些环境常量你可以根据当前环境条件化地组织配置。例如下面的应用配置会在开发环境中启用调试工具栏与调试器$config [...]; if (YII_ENV_DEV) { // configuration adjustments for dev environment $config[bootstrap][] debug; $config[modules][debug] yii\debug\Module; } return $config;源码视角环境常量的定义与默认值环境常量的完整定义位于 framework/BaseYii.php。框架在加载时依次执行defined(YII_ENV) or define(YII_ENV, prod); defined(YII_ENV_PROD) or define(YII_ENV_PROD, YII_ENV prod); defined(YII_ENV_DEV) or define(YII_ENV_DEV, YII_ENV dev); defined(YII_ENV_TEST) or define(YII_ENV_TEST, YII_ENV test);即如果你不在入口脚本中定义YII_ENV框架会将其默认为prod并据此推导出YII_ENV_PROD、YII_ENV_DEV、YII_ENV_TEST三个布尔常量。实践中常在入口脚本中先定义YII_DEBUG与YII_ENV如dev再引入框架从而让调试、日志与配置分支在开发与生产环境之间自动切换。除prod、dev、test外YII_ENV也可以取staging等自定义值但只有上述三个内置值会触发对应的布尔常量。配置使用要点小结创建新对象用Yii::createObject($config)配置数组必须包含class或__class键初始化已有对象用Yii::configure($object, $config)此时配置数组不能包含class键。配置键on eventName挂载事件、as behaviorName附加行为前缀解析由yii\base\Component::__set()完成。自定义类构造函数末尾调用parent::__construct($config)即可自动获得 Yii 2 标准的配置初始化能力framework/base/BaseObject.php。复杂配置应拆分为多个可require的配置文件跨场景复用且不想重复书写的配置交给Yii::$container-set()/setSingleton()作为默认配置统一管理。通过YII_ENV及其派生的YII_ENV_PROD/YII_ENV_DEV/YII_ENV_TEST常量可以在不同环境中条件化地加载不同配置实现开发、测试、生产配置的无缝切换。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2 配置机制完全指南配置格式、应用与组件配置、默认配置及 YII_ENV 环境切换Yii 2 配置机制完全指南配置格式、应用与组件配置、默认配置及 YII_ENV 环境切换 Yii 2 框架中配置Configuration是创建对象、后端Web框架Yii 2 配置系统完全指南创建对象、应用配置、默认配置与环境常量Yii 2 配置系统完全指南创建对象、应用配置、默认配置与环境常量 配置Configuration是 Yii 2 框架最核心的基础设施之一无论是创建数据后端Web框架Yii 2 应用组件Application Components全面解析服务定位、注册方式与核心组件配置实战Yii 2 应用组件Application Components全面解析服务定位、注册方式与核心组件配置实战 应用组件Application Compo后端Web框架上一篇WarcraftHelper5大实用功能让你的魔兽争霸3告别卡顿与限制下一篇魔兽争霸3优化秘籍5大功能让你的经典游戏重获新生创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表