Symfony2 устанавливает глобальный параметр на основе поддоменов

1

используя symfony 2.8, я работаю с субдоменами, и я хочу показать разные (скажем) домашние страницы в зависимости от субдомена, я храню субдомены в таблице Domain с столбцом с именем subdomain. в идеале, когда пользователь посещает sub.example.com я хочу выполнить поиск в базе данных для "sub" и получить id этой row и установить это как глобальный параметр для этого конкретного домена, чтобы я мог загружать настройки веб-сайтов и загружать другие динамические данные из базы данных (с использованием domain_id в качестве ключа)

это то, что я считаю правильным, если есть лучшие методы для решения этой же проблемы, пожалуйста, дайте мне знать, я мог бы получить друга, чтобы раздавать щедрость, если он будет для меня новым.

Теги:
subdomain

2 ответа

0
Лучший ответ

Я предлагаю вам прослушать событие kernel.controller. Убедитесь, что ваш слушатель осведомлен о контейнере, поэтому вы можете установить параметр, выполнив $this->container->setParameter('subdomain', $subdomain);

На этом этапе вам просто нужно проверить параметр, который вы установили там, где он вам подходит, например, в действии вашего контроллера, чтобы вы могли возвращать, например, разные представления в соответствии с текущим субдоменом.

Справка:

  1. Диспетчер, осведомленный о контейнере
  2. Основные события Symfony2
  • 0
    Спасибо, но действительно ли можно ссылаться на параметр subdomain каждый раз, когда мне нужно сделать запрос БД? в настоящее время, где я стою, мне нужно будет использовать domain_id в каждом запросе к базе данных
  • 0
    Это о вашей доменной логике, поэтому я думаю, что это действительно зависит Я думаю, это слишком широкий и более касающийся вопросов дизайна программного обеспечения.
Показать ещё 3 комментария
0

Взгляните на мою реализацию, используя конфигурацию 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());
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню