/** * @param Component $component * @return \skeeks\sx\validate\Result */ public function validate($component) { if (!$component instanceof ActiveRecord) { return $this->_bad(\Yii::t('app', "Object: {class} must be inherited from: {parent}", ['class' => $component->className(), 'parent' => ActiveRecord::className()])); } return !$component->isNewRecord ? $this->_ok() : $this->_bad(\Yii::t('app', "The object must already be saved")); }
/** * Getting behavior object from given model * * @param Component $model * @return SeoBehavior * @throws InvalidConfigException if model don't have our SeoBehavior */ protected static function behavior(Component $model) { foreach ($model->getBehaviors() as $b) { if ($b instanceof SeoBehavior) { return $b; } } throw new InvalidConfigException('Model ' . $model->className() . ' must have SeoBehavior'); }
public function testOf() { $container = new Container(); $className = Component::className(); $instance = Instance::of($className, $container); $this->assertTrue($instance instanceof Instance); $this->assertTrue($instance->get() instanceof Component); $this->assertTrue(Instance::ensure($instance, $className) instanceof Component); $this->assertTrue($instance->get() !== Instance::ensure($instance, $className)); }
/** * @param Component $component * @return \skeeks\sx\validate\Result */ public function validate($component) { if (!$component instanceof Component) { return $this->_bad(\Yii::t('app', "The object must be inherited from") . ": " . Component::className()); } if (!$this->_behavior) { return $this->_ok(); } $hasBehaviors = $component->getBehaviors(); foreach ($hasBehaviors as $behavior) { if ($behavior instanceof $this->_behavior) { return $this->_ok(); } } return $this->_bad(\Yii::t('app', "At the component: {class} requires a behavior", ['class' => $component->className()]) . ": " . $this->_behavior); }
/** * Checks whether or not a subject has a behavior of a certain type attached. * * @param \yii\base\Component $subject the subject to check * @param string|\yii\base\Behavior $behavior either the class name or an instance of the behavior * @param bool $throwException if set to true, an exception will be thrown if the * subject doesn't have the behavior attached * @return bool true if attached * @throws \yii\base\InvalidParamException when subject is of wrong type * @throws \yii\base\InvalidConfigException if desired and behavior missing */ public static function hasBehavior($subject, $behavior, $throwException = false) { //only components allowed if (!$subject instanceof \yii\base\Component) { throw new InvalidParamException(Yii::t('app', 'Subject must extend Component')); } //prepare vars $behavior = $behavior instanceof \yii\base\Behavior ? $behavior::className() : $behavior; //check if behavior is attached $found = false; foreach ($subject->behaviors() as $name => $config) { $className = is_array($config) ? $config['class'] : $config; if (strcmp($className, $behavior) === 0) { $found = true; break; } } if ($throwException && !$found) { $msg = Yii::t('app', '{subject} needs to have behavior {behavior} attached', ['subject' => $subject->className(), 'behavior' => $behavior]); throw new InvalidConfigException($msg); } return $found; }
} function name($event) { echo 'hi ' . $event->data . '<br />'; } function event() { echo 'hello event!<br />'; } function event2() { echo 'hello event2!<br />'; } $test = new Test2(); $test->on('say', 'hello'); $test->on('say', 'name', 'shuru'); $test->on('say', [$test, 'test']); $test->on('say', ['Test2', 'test_two']); $test->trigger('say'); //会触发实例的事件 echo '<hr />'; $test->off('say', 'hello'); $test->trigger('say'); echo '<hr />'; Event::on(Test2::className(), 'say', 'event'); $test->trigger('say'); //因为该对象的类,也绑定了该事件,因此会触发类事件,类事件是在Event.php里面 echo '<hr />'; Event::on(Component::className(), 'say', 'event2'); //父类也绑定了该事件,因此,也会被触发 $test->trigger('say');