YII2 框架总结

           事件、行为、组件、过滤器和小部件,以及依赖注入、DI容器和服务定位器

(1)事件和行为都是工具,先有事件和行为,后有使用它们的组件。
(2)事件(Event)只能被绑定到组件上,它可以在组件内部由组件绑定,也可以在组件外部由行为绑定,但通常在组件内部被触发。事件既是代码解耦的一种方式,也是设计业务流程的一种模式。【组件可以附加代码到一个事件,当这个事件被触发时,这些代码就会自动执行。】
(3)行为(Behavior),只能被注入到组件中,行为是对组件属性和功能的扩充,它既可以通过在组件的behaviors( )函数内部静态配置行为的方法注入,也可以通过组件的attachBehavior( )方法动态注入。行为还可以通过$owner来访问所依附的组件,从而可以在行为内部对所依附的组件绑定一个事件,该功能已经在行为类中实现。在行为中,可以通过在它的events( )方法中配置[事件名,处理函数],静态绑定事件。
(4)过滤器(Filter),就是一种预定义的行为,可以实现对相应组件的各种过滤。它主要应用于控制器,同样适用于web应用和模块Module。模型的规则验证不是行为,只是模型中硬编码的“行为”,也可通过rules()函数声明预定义过滤器。
(5)小部件(Widget),它是在视图中使用的可重用可配置的用户界面单元。它有两种渲染方式,一种是使用widget( )构造函数的方法,另一种是使用begin( )和end( )的方法。
(6)依赖注入(Dependency Injection, DI),它是控制反转IoC的一种设计模式,它的核心是把类所依赖的单元的实例化过程,放到类的外面去实现。在Yii中使用DI解耦,有两种注入方法:构造函数注入和属性注入。打比方说,Comment类中可以使用多种邮件服务发送消息邮件,既可以使用构造函数的形参接收服务对象,也可以使用属性接收服务对象。从顺序上,应先实例化服务类,后实例化接收类。
(7)依赖注入容器,它是一种对在其上注册过依赖关系的类,自动进行依赖关系实例化的工具,即为配置组件提供方便。在DI容器上,既可以注册类,也可以注册对象,还可以注册接口和PHP Callable。由于接口的多态性,如果依赖关系中有接口,要求必须注册接口和实现它的接口类。而对类的DI容器注册,是为了实现对类的属性配置,或是为了生成一个某一别名的对象。在DI容器中注册类的配置,可以实现在以后多次共享该配置。注册依赖关系没有先后顺序,可以注册一个接口、一个别名、一个类,也可以使用配置数组的方法来注册一个类、一个别名,也可以用一个对象或一个PHP Callable来注册一个别名。对于注册过的类配置,可以再次覆盖注册。
(8)服务定位器(Service Locator),它充当了一个运行时链接器的角色,可以在运行时动态地修改一个类所选用的服务,而不必对类做任何的修改,可以实现服务提供方和使用方完全的解耦,便于独立测试和代码跨框架复用。在Yii中,应用Application和模块Module都是一个服务定位器,每次在web应用的配置文件的components项写入配置信息,其实都是在向Application注册服务。
(9)DI容器和服务定位器是如何相互配合的?
DI容器和服务定位器都是IoC的不同实现方式,它们并不冲突,两者可以结合使用。在Yii的web应用中,就是通过DI容器实现了服务定位器。在具体实现中,服务定位器通过Yii::createObject( )来获取实例,而这个Yii::createObject( )是调用了DI容器的yii\di\Container::get( )来向Yii::$container索要实例的。因此,服务定位器最终是通过DI容器来创建和获取实例的。在实际使用中,我们通过Yii::$container->get("类名")来获取唯一的实例。

----------------------------------------------------------------------------------------------------------------------

如果该博文对你有益,请点赞。

你可能感兴趣的:(Yii笔记)