* * @since 1.0 */ class AuthItem extends \yii\base\Model { public $name; public $type; public $description; public $ruleName; public $data; /** * @var Item */ private $_item; /** * Initialize object. * * @param Item $item * @param array $config */ public function __construct($item, $config = []) { $this->_item = $item; if ($item !== null) { $this->name = $item->name; $this->type = $item->type; $this->description = $item->description; $this->ruleName = $item->ruleName; $this->data = $item->data === null ? null : Json::encode($item->data); } parent::__construct($config); } /** * {@inheritdoc} */ public function rules() { return [ [['ruleName'], 'in', 'range' => array_keys(Yii::$app->authManager->getRules()), 'message' => 'Rule not exists', ], [['name', 'type'], 'required'], [['name'], 'unique2', 'when' => function () {//Yii2新版本修改了Validator createValidator方法,导致inlineValidator无法和自带验证器重名 return $this->isNewRecord || ($this->_item->name != $this->name); }], [['type'], 'integer'], [['description', 'data', 'ruleName'], 'default'], [['name'], 'string', 'max' => 64], ]; } public function unique2() { $authManager = Yii::$app->authManager; $value = $this->name; if ($authManager->getRole($value) !== null || $authManager->getPermission($value) !== null) { $message = Yii::t('yii', '{attribute} "{value}" has already been taken.'); $params = [ 'attribute' => $this->getAttributeLabel('name'), 'value' => $value, ]; $this->addError('name', Yii::$app->getI18n()->format($message, $params, Yii::$app->language)); } } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'name' => Yii::t('rbac', 'Name'), 'type' => Yii::t('rbac', 'Type'), 'description' => Yii::t('rbac', 'Description'), 'ruleName' => Yii::t('rbac', 'Rule Name'), 'data' => Yii::t('rbac', 'Data'), ]; } /** * Check if is new record. * * @return bool */ public function getIsNewRecord() { return $this->_item === null; } /** * Find role. * * @param string $id * * @return null|\self */ public static function find($id) { $item = Yii::$app->authManager->getRole($id); if ($item !== null) { return new self($item); } return; } /** * Save role to [[\yii\rbac\authManager]]. * * @return bool */ public function save() { if ($this->validate()) { $manager = Yii::$app->authManager; if ($this->_item === null) { if ($this->type == Item::TYPE_ROLE) { $this->_item = $manager->createRole($this->name); } else { $this->_item = $manager->createPermission($this->name); } $isNew = true; } else { $isNew = false; $oldName = $this->_item->name; } $this->_item->name = $this->name; $this->_item->description = $this->description; $this->_item->ruleName = $this->ruleName; $this->_item->data = $this->data === null || $this->data === '' ? null : Json::decode($this->data); if ($isNew) { $manager->add($this->_item); } else { $manager->update($oldName, $this->_item); } return true; } else { return false; } } /** * Get item. * * @return Item */ public function getItem() { return $this->_item; } /** * Get type name. * * @param mixed $type * * @return string|array */ public static function getTypeName($type = null) { $result = [ Item::TYPE_PERMISSION => 'Permission', Item::TYPE_ROLE => 'Role', ]; if ($type === null) { return $result; } return $result[$type]; } }