используя symfony 2.8, я работаю с субдоменами, и я хочу показать разные (скажем) домашние страницы в зависимости от субдомена, я храню субдомены в таблице Domain
с столбцом с именем subdomain
. в идеале, когда пользователь посещает sub.example.com
я хочу выполнить поиск в базе данных для "sub" и получить id
этой row
и установить это как глобальный параметр для этого конкретного домена, чтобы я мог загружать настройки веб-сайтов и загружать другие динамические данные из базы данных (с использованием domain_id в качестве ключа)
это то, что я считаю правильным, если есть лучшие методы для решения этой же проблемы, пожалуйста, дайте мне знать, я мог бы получить друга, чтобы раздавать щедрость, если он будет для меня новым.
Я предлагаю вам прослушать событие kernel.controller. Убедитесь, что ваш слушатель осведомлен о контейнере, поэтому вы можете установить параметр, выполнив $this->container->setParameter('subdomain', $subdomain);
На этом этапе вам просто нужно проверить параметр, который вы установили там, где он вам подходит, например, в действии вашего контроллера, чтобы вы могли возвращать, например, разные представления в соответствии с текущим субдоменом.
Справка:
Взгляните на мою реализацию, используя конфигурацию YAML вместо базы данных: https://github.com/fourlabsldn/HostsBundle. Возможно, вы сможете получить вдохновение.
<?php
namespace FourLabs\HostsBundle\Service;
use Symfony\Component\HttpFoundation\RequestStack;
use FourLabs\HostsBundle\Model\DomainRepository;
use FourLabs\HostsBundle\Exception\NotConfiguredException;
abstract class AbstractProvider
{
/**
* @var RequestStack
*/
protected $requestStack;
/**
* @var DomainRepository
*/
protected $domainRepository;
/**
* @var boolean
*/
protected $requestActive;
public function __construct(RequestStack $requestStack, DomainRepository $domainRepository, $requestActive)
{
$this->requestStack = $requestStack;
$this->domainRepository = $domainRepository;
$this->requestActive = $requestActive;
}
protected function getDomainConfig()
{
$request = $this->requestStack->getCurrentRequest();
if(is_null($request) || !$this->requestActive) {
return;
}
$host = parse_url($request->getUri())['host'];
if(!($domain = $this->domainRepository->findByHost($host))) {
throw new NotConfiguredException('Domain configuration for '.$host.' missing');
}
return $domain;
}
}
и слушатель
<?php
namespace FourLabs\HostsBundle\EventListener;
use FourLabs\HostsBundle\Service\LocaleProvider;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class LocaleListener
{
/**
* @var LocaleProvider
*/
private $localeProvider;
public function __construct(LocaleProvider $localeProvider) {
$this->localeProvider = $localeProvider;
}
public function onKernelRequest(GetResponseEvent $event) {
if(HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$event->getRequest()->setLocale($this->localeProvider->getLocale());
}
}