1

我对 Symfony 2 比较陌生,但我有一个包含许多不同子域和用户区域的站点,我希望我的登录页面样式不同,但目前不是。我正在使用 Symfony 2 和 FOS UserBundle,目前一切正常,使用 security.yml 中的 1 个防火墙。我根据文档覆盖了 FOS UserBundle 布局,但我希望能够根据请求的来源来设置不同的页面样式,例如:microsite1.mainsite.com/user 获取样式 A microsite1.mainsite.com /admin 获取样式 B microsite2.mainsite.come/user 获取样式 C

我已经考虑了一些选择,我正在寻找其他意见。我考虑的第一个选项是覆盖/扩展 FOS UserBundle 中的控制器,以便可以识别引荐来源并呈现不同的树枝模板。另一种选择是为不同的路由使用不同的防火墙,但我们真的希望能够让不同微型站点中的用户在所有站点上进行身份验证,因此首选一个防火墙。有没有其他解决方案,或者有没有比另一种更可取的方法来解决这个相对较小的问题?

4

1 回答 1

1

您可以覆盖renderLogin. SecurityController您可以这样做:

namespace Acme\UserBundle\Controller;

use FOS\UserBundle\Controller\SecurityController as BaseController;
use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\Security\Core\SecurityContext;

use Symfony\Component\HttpFoundation\Request;


class SecurityController extends BaseController
{
    /**
    * Overriding the FOS default method so that we can choose a template
    */
    protected function renderLogin(array $data)
    {
        $template = $this->getTemplate();

        return $this->container->get('templating')->renderResponse($template, $data);
    }


    /**
    * You get the subdomain and return the correct template
    */
    public function getTemplate(){

        $subdomain = $this->container->get('request')->getHost();

        if ($subdomain === "microsite1.mainsite.com"){
            $template = sprintf('AcmeUserBundle:Security:loginMicrosite1.html.%s', $this->container->getParameter('fos_user.template.engine'));
        }
        elseif($subdomain === "microsite2.mainsite.com"){
            $template = sprintf('AcmeUserBundle:Security:loginMicrosite2.html.%s', $this->container->getParameter('fos_user.template.engine'));
       }
       //blablabla
       //Customize with what you need here.

       return $template;
    }
于 2013-02-10T10:43:46.563 回答