| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | <?phpnamespace common\modules\rbac\models;use common\modules\rbac\components\DbManager;use common\modules\rbac\validators\RbacValidator;use Yii;use yii\base\InvalidConfigException;use yii\base\Model;use yii\helpers\ArrayHelper;use yii\rbac\Item;class Assignment extends Model{    /** @var array */    public $items = [];    /** @var integer */    public $user_id;    /** @var boolean */    public $updated = false;    /** @var DbManager */    protected $manager;    /**     * @inheritdoc     */    public function init()    {        parent::init();        $this->manager = Yii::$app->authManager;        if ($this->user_id === null) {            throw new InvalidConfigException('user_id must be set');        }        $this->items = array_keys($this->manager->getItemsByUser($this->user_id));    }    /**     * @inheritdoc     */    public function attributeLabels()    {        return [            'items' => '角色'        ];    }    /**     * @inheritdoc     */    public function rules()    {        return [            [                'user_id',                'required'            ],            [                'items',                RbacValidator::className()            ],            [                'user_id',                'integer'            ]        ];    }    /**     * Updates auth assignments for user.     *     * @return boolean     */    public function updateAssignments()    {        if (! $this->validate()) {            return false;        }        if (! is_array($this->items)) {            $this->items = [];        }        $assignedItems = $this->manager->getItemsByUser($this->user_id);        $assignedItemsNames = array_keys($assignedItems);        foreach (array_diff($assignedItemsNames, $this->items) as $item) {            $this->manager->revoke($assignedItems[$item], $this->user_id);        }        foreach (array_diff($this->items, $assignedItemsNames) as $item) {            $this->manager->assign($this->manager->getItem($item), $this->user_id);        }        $this->updated = true;        return true;    }    /**     * Returns all available auth items to be attached to user.     *     * @return array     */    public function getAvailableItems($type)    {        if ($type == Item::TYPE_ROLE) {            $items = $this->manager->getRoles();        } else {            $items = $this->manager->getPermissions();        }        return ArrayHelper::map($items, 'name', function ($item) {            return empty($item->description) ? $item->name : $item->name . ' (' . $item->description . ')';        });    }    public function getAvailableRoles()    {        return $this->getAvailableItems(Item::TYPE_ROLE);    }}
 |