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();
}
}