찾다
php教程php手册简要剖析PHP的Yii框架的组件化机制的基本知识,yii框架

简要剖析PHP的Yii框架的组件化机制的基本知识,yii框架

组件是 Yii 应用的主要基石。是 yii\base\Component 类或其子类的实例。三个用以区分它和其它类的主要功能有:

  • 属性(Property)
  • 事件(Event)
  • 行为(Behavior)

或单独使用,或彼此配合,这些功能的应用让 Yii 的类变得更加灵活和易用。以小部件 yii\jui\DatePicker 来举例,这是个方便你在 视图中生成一个交互式日期选择器的 UI 组件:

use yii\jui\DatePicker;

echo DatePicker::widget([
  'language' => 'zh-CN',
  'name' => 'country',
  'clientOptions' => [
    'dateFormat' => 'yy-mm-dd',
  ],
]);

这个小部件继承自 yii\base\Component,它的各项属性改写起来会很容易。

正是因为组件功能的强大,他们比常规的对象(Object)稍微重量级一点,因为他们要使用额外的内存和 CPU 时间来处理 事件 和 行为 。如果你不需要这两项功能,可以继承 yii\base\Object 而不是 yii\base\Component。这样组件可以像普通 PHP 对象一样高效,同时还支持属性(Property)功能。

当继承 yii\base\Component 或 yii\base\Object 时,推荐你使用如下的编码风格:

若你需要重写构造方法(Constructor),传入 $config 作为构造器方法最后一个参数,然后把它传递给父类的构造方法。
永远在你重写的构造方法结尾处调用一下父类的构造方法。
如果你重写了 yii\base\Object::init() 方法,请确保你在 init 方法的开头处调用了父类的 init 方法。
例子如下:

namespace yii\components\MyClass;

use yii\base\Object;

class MyClass extends Object
{
  public $prop1;
  public $prop2;

  public function __construct($param1, $param2, $config = [])
  {
    // ... 配置生效前的初始化过程

    parent::__construct($config);
  }

  public function init()
  {
    parent::init();

    // ... 配置生效后的初始化过程
  }
}

另外,为了让组件可以在创建实例时能被正确配置,请遵照以下操作流程:

$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// 方法二:
$component = \Yii::createObject([
  'class' => MyClass::className(),
  'prop1' => 3,
  'prop2' => 4,
], [1, 2]);

补充:尽管调用 Yii::createObject() 的方法看起来更加复杂,但这主要因为它更加灵活强大,它是基于依赖注入容器实现的。
yii\base\Object 类执行时的生命周期如下:

构造方法内的预初始化过程。你可以在这儿给各属性设置缺省值。
通过 $config 配置对象。配置的过程可能会覆盖掉先前在构造方法内设置的默认值。
在 yii\base\Object::init() 方法内进行初始化后的收尾工作。你可以通过重写此方法,进行一些良品检验,属性的初始化之类的工作。
对象方法调用。
前三步都是在对象的构造方法内发生的。这意味着一旦你获得了一个对象实例,那么它就已经初始化就绪可供使用。

应用程序CWebApplication组件
在说明Yii中各个组件使用方法前,先了解最重要的一个组件CWebApplication。CWebApplication即应用程序对象,它的根类也是CComponent,故它也是一个组件,具有Yii组件的共同特征。
具体来说,CWebApplication组件的主要作用是根据配置文件,加载必要的辅助组件,并在这些组件的帮助下(如urlManager)创建并运行控制器。故也将其称为前端控制器。
我们可以在配置文件中指定CWebApplication组件本身的配置参数,这些参数被设置为其公共成员变量,或是自动调用setter方法设置属性,这个特性可以在CWebApplication的构造函数中发现:$this->configure($config);
如在配置文件protected/config/main.php全局中指定:

'charset' => 'utf-8',

这实际是设置当前应用程序的charset公共属性(在CApplication中声明)而如果在配置文件中指定'language' => 'zh_cn', 我们发现CWebApplication及其所有上级类均未声明$language属性,这时将使用setter模式方法即setlanuage(此方法定义在CApplication类中)。
OK,了解这个特性之后,我们就可以明白在配置文件中可以配置的属性:

  • CWebApplication及其所有上级类的公共成员变量
  • CWebApplication及其所有上级类的setter方法指定的属性当然我们也可以通过继承CWebApplication构造自己的应用程序类。

CWebApplication的继承层次为:CApplication -> CModule -> CComponent, 我们将默认的配置文件中常见的配置项及其生效位置予以说明:

  • basePath :  CApplication::setBasePath()
  • name: CApplication::$name
  • preload: CModule::$preload
  • import: CModule::setImport()
  • defaultController: CWebApplication::$defaultController
  • components: CModule::setComponents()

类似地,再列出几个默认配置文件中并未列出的配置项:timezone: CApplication::setTimeZone()  #配置时区

再例如,如果我们继承CWebApplication, 扩展自己的应用程序类myApp, 并定义方法setError_reporting(不区分大小写), 那么就可以直接在配置文件中指定error_reporting选项。
辅助组件可以将CWebApplication组件视为一部机器,那么辅助组件就可以视为组成这部机器的各个零件,没有零件的正确组合,机器就无法正常工作,这在Yii中也是同样的概念。而一些组件对整部机器的运转是必须的,这就是核心组件。在应用程序对象构造后,Yii会将辅助组件基本信息进行登记(组件名称与类名,属性配置的对照表),以供后续使用,对web应用程序而言,存在以下核心组件(通过CWebApplication::registerCoreComponents,CApplication::registerCoreComponents注册):

CWebApplication::registerCoreComponents中注册的核心组件

CApplication::registerCoreComponents中注册的核心组件

配置文本中注册的核心组件:log CLogRouter 日志路由管理器
以上标记为红色的条目,是最重要的辅助组件,其它的核心组件我们未必会使用到。
如何定义辅助组件的属性?通过在配置文件protected/config/main.php中设置components项的值,实现组件属性定义。这里的定义主要是三个要素:指定组件的名称(核心组件已经预先设置)、指定组件使用的类(核心组件无须定义),组件的属性(可选、视情况而定)
如以下配置:

'components' => array(
'db' => array(
'class' => 'myCDbConnection',
'connnectionString' => 'mysql:host=localhost;dbname=test;charset=utf8',
'user' => 'root',
),
);

就设置了db组件使用的类为myCDbConnection, 并且在后面指定了连接串及账号等信息。提示: myCDbConnection类可能就是通过继承CDbConnection类定义。核心组件无须指定class参数(因为已经预先定义好)
问题:如何得知某个组件可配置的属性?这个问题至关重要,如果我们掌握了规律,就可以举一反三,所有组件的配置均可以灵活设定。授之以鱼不如授之以渔。在本节会说明通用的方法。要得知组件的所有可定义属性,按以下步骤进行:
1. 组件所使用的类是什么?(无论是核心组件还是自定义组件)
2. 组件类的公共成员变量都有哪些?(注意从父类继承而来的公共成员变量)
3. 组件类都有哪些settter方法?(注意从父类继承而来的方法)
明白了以上三个要点,我们就可以按规律定义组件的属性,比如对最重要的db组件,我们发现这是一个核心组件,使用的类为CDbConnection, 我们查阅这个类的定义文件,发现这个类的公共成员变量有:

$connectionString;

  • $username='';
  • $password='';
  • $autoConnect=true;
  • $charset;
  • $emulatePrepare;
  • $tablePrefix;
  • $initSQLs;
  • ... ...

setter方法定义的属性:

  • setActive($value)
  • setAttributes($values)
  • setAutoCommit($value)
  • setColumnCase($value)
  • setNullConversion($value)
  • setPersistent($value)

提示:setter方法定义的属性名称不区分大小写以上所列的属性,均可以在配置文件中指定,具体每个属性的作用,请参阅Yii类文件的详细注释(Yii代码的注释也是相当棒,通俗易懂,而又很详细)

再来一个例子,定义urlManager组件的属性这个组件使用的类为CUrlManager, 我们查阅它的属性:

  • $rules=array();
  • $urlSuffix='';
  • $showScriptName=true;
  • $appendParams=true;
  • $routeVar='r';
  • $caseSensitive=true;

通过setter方法定义的属性:

  • setUrlFormat($value)
  • setBaseUrl($value)

即urlManager组件的上述属性可以在配置文件中定义(每项配置的作用请参阅其注释)。其它组件的配置均可按上述方法处理。

如何使用组件应用程序运行后,会将所有已经定义过的组件注册(并未实例化)到CWebApplication对象上,同时CWebApplication应用程序对象会被注册到Yii::$_app,在程序的任何位置均可通过Yii::app()得到当前应用程序对象引用,再通过$app对象得到组件实例引用,如:Yii::app()->getComponent('urlManager');  #会查找组件配置并实例化之Yii::app()->urlManager;  #通过CModule::__get()魔术方法实现
如何自定义组件?这是很常见的需求,比如我们可能希望db组件(数据库连接)使用我们自定义的类,也或者我们希望使用多个数据库连接,这种情况下就需要自定义组件,使用多数据库的例子:

components=>array(
'db' => array(
... ...
),
'mydb'=>array(
'class' => 'myDbConnection',
'connectionString' => 'mysql:host=localhost;dbname=test;charset=utf8',
'tablePrefix' => 'cdb_',
'username' => 'root',
),
),
修改默认的db组件所使用的类:
components=>array(
'db' => array(
'class' => 'myDbConnection',
... ...
),
),

经过本文的分析,我是深切理解了Yii组件化机制给应用程序带来的极大的扩展性,哈哈哈哈~

您可能感兴趣的文章:

  • PHP的Yii框架中行为的定义与绑定方法讲解
  • 详解在PHP的Yii框架中使用行为Behaviors的方法
  • 深入讲解PHP的Yii框架中的属性(Property)
  • 解读PHP的Yii框架中请求与响应的处理流程
  • PHP的Yii框架中使用数据库的配置和SQL操作实例教程
  • 实例讲解如何在PHP的Yii框架中进行错误和异常处理
  • 解析PHP的Yii框架中cookie和session功能的相关操作
  • PHP的Yii框架中YiiBase入口类的扩展写法示例
  • 详解PHP的Yii框架的运行机制及其路由功能
  • 深入解析PHP的Yii框架中的event事件机制
  • 全面解读PHP的Yii框架中的日志功能
  • PHP的Yii框架中移除组件所绑定的行为的方法
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.