Я добился чего-то подобного, переписав метод hasCredential в myUser для выполнения пользовательских проверок, когда требуются определенные учетные данные.
например:
public function hasCredential($credential, $useAnd = true) {
// make sure the symfony core always passes the team leader permission, we handle it later ourselves
$this->addCredential('team_leader');
$ret = parent::hasCredential($credential, $useAnd);
// if other checks have failed, return false now, no point continuing
if (!$ret) return false;
if ($credential == 'team_leader' || (is_array($credential) && in_array('team_leader', $credential))) {
// do stuff here. in this example, we get the object from a route and check the user is a leader
$route = sfcontext::getinstance()->getRequest()->getAttribute('sf_route');
if (!$route instanceof sfObjectRoute) {
throw new sfConfigurationException(sprintf('team_leader credential cannot be used against routes of class %s - must be sfObjectRoute', get_class($route)));
}
return $this->isLeader($route->getObject());
}
return $ret;
}
Затем вы можете добавить учетные данные «team_leader» в security.yml, как и любые другие.
Очевидно, это зависит от того, используете ли вы sfObjectRoutes, поэтому, возможно, вам это не подойдет, если вы не можете этого сделать и не можете адаптировать то, что используете, но я думаю, что это хорошее решение, когда вы можете его использовать!
Если вы беспокоитесь о дополнительных запросах, вы можете посмотреть на обертывание некоторого кэширования вокруг вызовов isLeader.