diff --git a/framework/rbac/DbManager.php b/framework/rbac/DbManager.php index f8731af..a4a8396 100644 --- a/framework/rbac/DbManager.php +++ b/framework/rbac/DbManager.php @@ -631,14 +631,20 @@ class DbManager extends Manager * * @param Rule $rule the rule that has been changed. */ - public function saveRule(Rule $rule) + public function insertRule(Rule $rule) { - $data = serialize($rule); - try { - $this->db->createCommand()->insert($this->ruleTable, ['name' => $rule->name, 'data' => $data])->execute(); - } catch (\yii\db\Exception $e) { - $this->db->createCommand()->update($this->ruleTable, ['data' => $data], ['name' => $rule->name])->execute(); - } + $this->db->createCommand()->insert($this->ruleTable, ['name' => $rule->name, 'data' => serialize($rule)])->execute(); + } + + /** + * Updates existing rule. + * + * @param string $name the name of the rule to update + * @param Rule $rule new rule + */ + public function updateRule($name, Rule $rule) + { + $this->db->createCommand()->update($this->ruleTable, ['name' => $rule->name, 'data' => serialize($rule)], ['name' => $name])->execute(); } /** diff --git a/framework/rbac/Manager.php b/framework/rbac/Manager.php index 1ab494f..714f1cc 100644 --- a/framework/rbac/Manager.php +++ b/framework/rbac/Manager.php @@ -323,11 +323,19 @@ abstract class Manager extends Component abstract public function removeRule($name); /** - * Saves the changes to the rule. + * Inserts new rule. * - * @param Rule $rule the rule that has been changed. + * @param Rule $rule the rule that needs to be stored. */ - abstract public function saveRule(Rule $rule); + abstract public function insertRule(Rule $rule); + + /** + * Updates existing rule. + * + * @param string $name the name of the rule to update + * @param Rule $rule new rule + */ + abstract public function updateRule($name, Rule $rule); /** * Returns rule given its name. diff --git a/framework/rbac/PhpManager.php b/framework/rbac/PhpManager.php index c64bc9c..fd6ee0c 100644 --- a/framework/rbac/PhpManager.php +++ b/framework/rbac/PhpManager.php @@ -601,12 +601,26 @@ class PhpManager extends Manager * * @param Rule $rule the rule that has been changed. */ - public function saveRule(Rule $rule) + public function insertRule(Rule $rule) { $this->_rules[$rule->name] = $rule; } /** + * Updates existing rule. + * + * @param string $name the name of the rule to update + * @param Rule $rule new rule + */ + public function updateRule($name, Rule $rule) + { + if ($rule->name !== $name) { + unset($this->_rules[$name]); + } + $this->_rules[$rule->name] = $rule; + } + + /** * Returns rule given its name. * * @param string $name name of the rule. diff --git a/tests/unit/framework/rbac/ManagerTestCase.php b/tests/unit/framework/rbac/ManagerTestCase.php index 0aa6b87..40b2d84 100644 --- a/tests/unit/framework/rbac/ManagerTestCase.php +++ b/tests/unit/framework/rbac/ManagerTestCase.php @@ -178,29 +178,44 @@ abstract class ManagerTestCase extends TestCase $this->assertNull($rule); } - public function testSaveRule() + public function testInsertRule() { $ruleName = 'isReallyReallyAuthor'; $rule = new AuthorRule(['name' => $ruleName, 'reallyReally' => true]); - $this->auth->saveRule($rule); + $this->auth->insertRule($rule); /** @var AuthorRule $rule */ $rule = $this->auth->getRule($ruleName); $this->assertEquals($ruleName, $rule->name); $this->assertEquals(true, $rule->reallyReally); + } + public function testUpdateRule() + { + $rule = $this->auth->getRule('isAuthor'); + $rule->name = "newName"; $rule->reallyReally = false; - $this->auth->saveRule($rule); + $this->auth->updateRule('isAuthor', $rule); /** @var AuthorRule $rule */ - $rule = $this->auth->getRule($ruleName); + $rule = $this->auth->getRule('isAuthor'); + $this->assertEquals(null, $rule); + + $rule = $this->auth->getRule('newName'); + $this->assertEquals("newName", $rule->name); $this->assertEquals(false, $rule->reallyReally); + + $rule->reallyReally = true; + $this->auth->updateRule('newName', $rule); + + $rule = $this->auth->getRule('newName'); + $this->assertEquals(true, $rule->reallyReally); } public function testGetRules() { $rule = new AuthorRule(['name' => 'isReallyReallyAuthor', 'reallyReally' => true]); - $this->auth->saveRule($rule); + $this->auth->insertRule($rule); $rules = $this->auth->getRules(); @@ -281,7 +296,7 @@ abstract class ManagerTestCase extends TestCase protected function prepareData() { - $this->auth->saveRule(new AuthorRule()); + $this->auth->insertRule(new AuthorRule()); $this->auth->createOperation('createPost', 'create a post'); $this->auth->createOperation('readPost', 'read a post');