12. 程序扩展性(高级特性)

这里写图片描述


1.模块化
这里写图片描述

yii 模块化的实现
这里写图片描述
这里写图片描述
这里写图片描述

配置文件:
这里写图片描述
这里写图片描述

通过控制器访问:
这里写图片描述
这里写图片描述

通过 浏览器直接访问:
这里写图片描述

再生成子模块下的子模块:
这里写图片描述

开启子模块可以放父模块里配置:
这里写图片描述
这里写图片描述


2.事件机制
这里写图片描述

1.扫描式
2.绑定式(触发:trigger(),绑定: on())

这里写图片描述

<?php

namespace vendor\animal;

use \yii\base\Component;
use \yii\base\Event;

class MyEvent extends Event
{
    public $message;
}

class Cat extends Component
{
    public function shout()
    {
        echo 'miao,miao<br/>';
        $me = new MyEvent();
        $me->message = 'hello, my event<br/>';
        $this->trigger('miao', $me);
    }
}

这里写图片描述

<?php

namespace vendor\animal;

use \yii\base\Component;

class Dog
{
    public function look()
    {
        echo 'i am looking <br/>';
    }
}

这里写图片描述

<?php

namespace vendor\animal;

class Mourse
{
    public function run($e)
    {
        echo 'i am run<br/>';
        echo $e->message,'<br/>';
    }
}

这里写图片描述

<?php

namespace app\controllers;

use yii\web\Controller;
use vendor\animal\Cat;
use vendor\animal\Mourse;
use vendor\animal\Dog;
use \yii\base\Event;

class AnimalController extends Controller
{
    public function actionIndex()
    {
        //单例模式
        \Yii::$app->on(\yii\base\Application::EVENT_AFTER_REQUEST, function(){
            echo '<br/>响应之后';
        });

        $cat = new Cat();
        $cat2 = new Cat();
        $mourse = new Mourse();
        $dog = new Dog();

       // $cat->on('miao', [$mourse, 'run']);
       // $cat->on('miao', [$dog, 'look']);

        // 类级别的事件绑定,对类的每个实例都有效
//        Event::on(Cat::className(), 'miao', [$mourse, 'run']);
        Event::on(Cat::className(), 'miao', function(){
            echo 'miao 事件被触发';
        });

        //取消关注
        //$cat->off('miao', [$mourse,'run']);

        $cat->shout();
        // 第二只Cat 没有反应
        $cat2->shout();
    }
}

这里写图片描述


3.Mixin

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

这里写图片描述

1. 类的混合

<?php
namespace app\behaviors;

use yii\base\Behavior;

class Behavior1 extends Behavior
{
    public $height;
    protected $height1;

    public function eat()
    {
        echo 'dog eat';
    }

    public function events()
    {
        // 接收 'wang' 事件,触发 shout 方法
        return [
            'wang' => 'shout'
        ];
    }

    public function shout($events)
    {
        echo 'wang, wang, wang<br/>';
    }
}

这里写图片描述

<?php

namespace vendor\animal;

use app\behaviors\Behavior1;
use yii\base\Component;

class Dog extends Component
{
    public function behaviors()
    {
        return [
            Behavior1::className()
        ];
    }

    public function look()
    {
        echo 'i am looking <br/>';
    }
}
public function actionTest()
    {
        $dog = new Dog();
        $dog->look();
        $dog->eat();
        $dog->height = '18cm';
        //不能访问 protected ,private
       // $dog->height1 = 'aaa';
        echo '<br/>',$dog->height;
       // echo '<br/>',$dog->height1;
        $dog->trigger('wang');

    }

2. 对象的混合
这里写图片描述

<?php
namespace app\behaviors;

use yii\base\Behavior;

class Behavior1 extends Behavior
{
    public $height;
    protected $height1;

    public function eat()
    {
        echo 'dog eat';
    }

    public function events()
    {
        // 接收 'wang' 事件,触发 shout 方法
        return [
            'wang' => 'shout'
        ];
    }

    public function shout($events)
    {
        echo 'wang, wang, wang<br/>';
    }
}

这里写图片描述

<?php

namespace vendor\animal;

use app\behaviors\Behavior1;
use yii\base\Component;

class Dog extends Component
{
    /*public function behaviors()
    {
        return [
            Behavior1::className()
        ];
    }*/

    public function look()
    {
        echo 'i am looking <br/>';
    }
}

这里写图片描述

public function actionTest1()
    {
        $dog = new Dog();
        $behavior1 = new Behavior1();
        $dog->attachBehavior('behavior1', $behavior1);
        //$dog->detachBehavior('behavior1');
        $dog->eat();
    }

4. 依赖注入
这里写图片描述

1.容器(定义并解决依赖关系)

<?php

namespace app\controllers;

use yii\web\Controller;
use yii\di\Container;

class Test2Controller extends Controller
{
    public function actionIndex()
    {
        $container = new Container();
        $container->set('app\controllers\Driver', 'app\controllers\ManDriver');
        // $driver = new ManDriver();
        // new Car($driver)
        $car = $container->get('app\controllers\Car');
        $car->run();die;
    }
}

interface Driver
{
    public function driver();

}

class ManDriver implements Driver
{
    public function driver()
    {
        echo 'i am old man';
    }
}

class Car
{
    private $driver = null;

    public function __construct(Driver $driver)
    {
        $this->driver = $driver;
    }

    public function run()
    {
        $this->driver->driver();
    }
}

2.服务定位器(配置服务的参数信息)
这里写图片描述
这里写图片描述

<?php

namespace app\controllers;

use yii\web\Controller;
use yii\di\Container;
use yii\di\ServiceLocator;

class Test2Controller extends Controller
{
    public function actionIndex()
    {
        /*$container = new Container();
        $container->set('app\controllers\Driver', 'app\controllers\ManDriver');
        // $driver = new ManDriver();
        // new Car($driver)
        $car = $container->get('app\controllers\Car');
        $car->run();die;*/


        /*\Yii::$container->set('app\controllers\Driver',
                'app\controllers\ManDriver'
            );
        $sl = new ServiceLocator();
        $sl->set('car', [
            'class' => 'app\controllers\Car'
        ]);
        $car = $sl->get('car');
        $car->run();*/

        //如果在web中定义了
        \Yii::$container->set('app\controllers\Driver',
            'app\controllers\ManDriver'
        );
        \Yii::$app->car->run();
    }
}

interface Driver
{
    public function driver();

}

class ManDriver implements Driver
{
    public function driver()
    {
        echo 'i am old man';
    }
}

class Car
{
    private $driver = null;

    public function __construct(Driver $driver)
    {
        $this->driver = $driver;
    }

    public function run()
    {
        $this->driver->driver();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值