YII2的扩展篇

1. 模块化

将系统分成很多模块和子模块。可以通过GII生成模块。

创建模块的时候注意模块不要耦合,放在不同的文件夹中。

添加配置信息就可以使用了。

父模块调用子模块:

public function actionIndex(){
    //获取字模块
    $article = \YII::$app->getMoudle('article');
    // 获取处理当前请求控制器所属的模块
    $module = \Yii::$app->controller->module;
    //调用子模块
    $article->runAction('default/index');
}

注意:也可以通过路由直接访问

配置模块:

//在父模块中配置子模块
class Module extends \yii\base\Module{
    public function init(){
        parent::init();
        $this->modules = [
            'admin' => [
                // 此处应考虑使用一个更短的命名空间
                'class' => 'app\modules\forum\modules\admin\Module',
            ],
        ];
    }
}
//在全局中配置模块  
'modules' => [
    'forum' => [
        'class' => 'app\modules\forum\Module',
        // ... 模块其他配置 ...
    ],
],

2. 事件机制

  1. 扫描式
  2. 绑定式

增加事件处理:

$foo = new Foo;

// 处理器是全局函数
$foo->on(Foo::EVENT_HELLO, 'function_name');

// 处理器是对象方法
$foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);

// 处理器是静态类方法
$foo->on(Foo::EVENT_HELLO, ['app\components\Bar', 'methodName']);

// 处理器是匿名函数
$foo->on(Foo::EVENT_HELLO, function ($event) {
    //事件处理逻辑
});

移除事件处理:

// 处理器是全局函数
$foo->off(Foo::EVENT_HELLO, 'function_name');

// 处理器是对象方法
$foo->off(Foo::EVENT_HELLO, [$object, 'methodName']);

// 处理器是静态类方法
$foo->off(Foo::EVENT_HELLO, ['app\components\Bar', 'methodName']);

// 处理器是匿名函数
$foo->off(Foo::EVENT_HELLO, $anonymousFunction);

基本方法:

// 当事件被触发时以下代码显示 "abc"
// 因为 $event->data 包括被传递到 "on" 方法的数据
$foo->on(Foo::EVENT_HELLO, function ($event) {
    echo $event->data;
}, 'abc');

$foo->on(Foo::EVENT_HELLO, function ($event) {
    // 这个处理器将被插入到处理器队列的第一位...
}, $data, false);
  • 实例级别的事件处理
class MessageEvent extends Event
{
    public $message;
}

class Mailer extends Component
{
    const EVENT_MESSAGE_SENT = 'messageSent';
    public function send($message)
    {
        // ...发送 $message 的逻辑...
        
        $event = new MessageEvent;
        $event->message = $message;
        $this->trigger(self::EVENT_MESSAGE_SENT, $event);
    }
}

  • 类级别的事件处理
Event::on(Foo::className(), Foo::EVENT_HELLO, function ($event) {
    echo $event->sender;  // 显示 "app\models\Foo"
});

Event::trigger(Foo::className(), Foo::EVENT_HELLO);
  • 全局事件
Yii::$app->on('bar', function ($event) {
    echo get_class($event->sender);  // 显示 "app\components\Foo"
});

Yii::$app->trigger('bar', new Event(['sender' => new Foo]));

3. mixin

  1. 类的混合
  2. 对象的混合

4. 依赖注入(控制反转)

  1. 容器
  2. 服务定位器

你可能感兴趣的:(YII2的扩展篇)