几天编码后,我能完全按照我的意愿去做,我要分享我的解决方案:
我以在SO这里找到的一个例子开始,你可以在这里阅读这篇文章:
Symfony sfDoctrineGuardPlugin custom login query 它给了我一个想法,我执行了,所以,我创建\ LIB \ Util.class.php,具有的功能,一个用于查询后台用户和另一个用于前端用户
static public function retrieveCustomer($username, $isActive = true)
{
$query = Doctrine_Core::getTable('sfGuardUser')->createQuery('u')
->leftJoin('u.Groups g')
->leftJoin('g.Permissions p')
->where('u.username = ?', $username)
->addWhere('u.is_active = ?', $isActive)
->addWhere('g.name = ?', 'customers');
return $query->fetchOne();
}
static public function retrieveAdmin($username, $isActive = true)
{
$query = Doctrine_Core::getTable('sfGuardUser')->createQuery('u')
->leftJoin('u.Groups g')
->leftJoin('g.Permissions p')
->where('u.username = ?', $username)
->addWhere('u.is_active = ?', $isActive)
->whereIn('g.name', array('administrators','operators'));
return $query->fetchOne();
}
现在,在每个应用程序的app.yml
,我现在覆盖插件
#Example for apps/backend/config/app.yml
all:
sf_guard_plugin:
retrieve_by_username_callable: Util::retrieveAdmin
直到默认查询一切都很好,但我开始面对另一个问题,所以我打开一个新的线程: Overwriting isAuthenticated() in symfony在那里我得到了我的解决方案的最后一步,这是为每个应用程序设置型动物会话名称,因此,在每个应用程序的factories.yml
:
#apps\backend\config\factories.yml
storage:
class: sfSessionStorage
param:
session_name: backend
现在所有设置,前端的用户不能在后端应用程序登录,反之亦然。
随时发表评论
虽然,你想出了一个合理的答案。我建议你先分析一下你是否真的需要2个独立的应用程序。虽然这可能是合乎逻辑的,但您很快会发现在应用程序之间重复使用代码很困难,但国际化和测试存在一个问题。我发现拥有1个应用程序要容易得多。仅供参考,Symfony2也没有“应用”的概念。 – Dziamid 2011-04-12 21:56:22