Я использую symfony2 и в своем приложении для размещения студентов я создаю динамические субдомены для каждого университета, я настраиваю виртуальный хост с помощью подстановочной записи субдомена, чтобы любой субдомен был действительным.
Как я могу проверить, зарегистрирован ли поддомен и принадлежит ли он университету, и как мне отличить его от случайно набранного пользователь не зарегистрирован субдомен эффективно?
если я пойду с запросом к базе данных, то каждый случайный доступ любопытных пользователей приведет к большому количеству запросов к базе данных, а использование файла hosts будет слишком медленным (не лучшая практика)
Пожалуйста, предложите эффективный способ сделать это, используя php или symfony или любые другие методы, о которых вы, ребята, знаете
(дополнительная информация) будет опция «Бесплатная пробная версия», что приведет к большому количеству поддоменов, так как каждый и каждый начнут бесплатную пробную версию, очень хороший пример того, чего я пытаюсь достичь, будь это StudyStays
-Спасибо
Вы можете кэшировать все запросы субдомена (используя что-то вроде Doctrine cache в качестве оболочки для любой используемой вами системы кэширования), чтобы при каждой последующей проверке нужно было проверять только кеш, а не базу данных.
Также при добавлении / удалении / обновлении вашего объекта поддомен вы можете обновить значение кэша, чтобы поддерживать его в актуальном состоянии.
приложение / Config / config.yml
Установите поставщика услуг для Doctrine Cache Bundle, для получения дополнительной информации см. документы (очевидно, вам необходимо добавить Doctrine Cache Bundle вашим поставщикам и AppKernel).
doctrine_cache:
providers:
acme_subdomain:
type: filesystem # apc, array, redis, etc
namespace: acme_subdomain
Acme \ YourBundle \ Registry \ SubdomainRegistry
Создайте реестр, который может проверять состояние поддоменов и обновлять кеш при необходимости. В этом примере состояние сохраняется в виде строки, а не логического значения, поскольку (насколько я знаю) ключ «не найден» будет возвращать ложное значение, а не ноль.
use Doctrine\Common\Cache\Cache;
use Doctrine\Common\Persistence\ObjectManager;
class SubdomainRegistry implements SubdomainRegistry
{
const REGISTERED = 'registered';
const UNREGISTERED = 'unregistered';
/**
* @param ObjectManager
*/
protected $manager;
/**
* @param Cache
*/
protected $cache;
public function __construct(ObjectManager $manager, Cache $cache)
{
$this->manager = $manager;
$this->cache = $cache;
}
/**
* @param string $subdomain
* @return boolean
*/
public function isSubdomainRegistered($subdomain)
{
// If subdomain is not in cache update cache
if (!$this->cache->has($subdomain)) {
$this->updateRegistry($subdomain);
}
return self::REGISTERED === $this->cache->get($subdomain);
}
/**
* @param string $subdomain
* @return boolean
*/
public function registerSubdomain($subdomain)
{
$this->cache->set($subdomain, self::REGISTERED);
return $this;
}
/**
* @param string $subdomain
* @return boolean
*/
public function unregisterSubdomain($subdomain)
{
$this->cache->set($subdomain, self::UNREGISTERED);
return $this;
}
/**
* @param string $subdomain
* @return null
*/
private function updateRegistry($subdomain)
{
$object = $this->manager->findOneBy(array('subdomain' => $subdomain);
// $object->isActive() assume you are storing all subdomains after cancelling
// and setting it to inactive. You could put your own real logic here
if (null === $object || !$object->isActive()) {
$this->unregisterSubdomain($subdomain);
return null;
}
$this->registerSubdomain($subdomain);
}
Затем, когда вы регистрируете или отменяете регистрацию своего субдомена, вы можете добавить вызов в реестр в методе.
Например…
$subdomain = new Subdomain();
// Subdomain as a property of subdomain seems weird to me
// but as I can't immediately think of anything better I'll go with it
$subdomain->setSubdomain('acme');
// .. subdomain details
$this->manager->persist($subdomain);
$this->manager->flush();
$this->registry->registerSubdomain($subdomain->getSubdomain());
Других решений пока нет …