Zend Framework 2: Как установить Cookie в Module.php для доступа из других модулей
Я создал проект для показа рекламы. Каждая реклама имеет местоположение.
В настоящее время список, если реклама отображается. Теперь я хотел бы получить список мест в моем layout.phtml
и после щелчка по местоположению реклама должна быть отфильтрована.
Для этого я создал новый модуль под названием "Геолокация". Затем я создал двух новых помощников вида; один, чтобы показать все Местоположения, а другой, чтобы отобразить название выбранного Места, которое хранится в Cookie.
Когда вы нажимаете на местоположение в списке, вы получаете доступ к AJAX-запросу к контроллеру геолокации. Контроллер вызывает метод в сервисе для сохранения местоположения в куки.
Теперь я изменяю свои SQL-запросы и репозитории в моем рекламном модуле, чтобы они принимали местоположение, если оно установлено:
public function countAdvertsByCategory($location=false)
Обычно я бы добавил $location = $_COOKIE['ChosenCounty']
в моем контроллере рекламы, но я уверен, что есть лучший способ.
Я бы подумал, что я могу добавить это в module.php
из модуля геолокации. Если этот модуль включил переменную, $location
будет установлен со значением cookie, в противном случае он будет просто проигнорирован.
Это правильный путь или лучшая практика? И как бы я это сделал?
ОБНОВИТЬ
Теперь я изменил свою фабрику:
namespace Application\Navigation;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class MyNavigationFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
// previous without Geolocation
$navigation = new MyNavigation();
return $navigation->createService($serviceLocator);
$location = $serviceLocator->get('Geolocation\Service\Geolocation');
$navigation = new MyNavigation($location);
return $navigation->createService($serviceLocator);
}
НО, если бы я сейчас удалил свой модуль геолокации, то Factory в моем модуле приложения для создания моей навигации потерпел бы неудачу, означая, что моя Factory теперь зависит от этого нового модуля, который я не хотел. Как я мог избежать этого?
1 ответ
Вы можете добавить значение cookie в качестве "сервиса" для менеджера сервисов. Всякий раз, когда вам нужно $location
Затем вы просто получите его у менеджера сервиса.
Создайте фабрику, которая обращается к требуемой переменной cookie.
namespace GeoLocation\Service;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
class GeoLocationFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$request = $serviceLocator->get('Request');
$cookies = $request->getHeaders()->get('cookie');
return isset($cookies->location) ? $cookies->location : false;
}
}
Затем зарегистрируйте его у менеджера сервиса в module.config.php
,
'service_manager' => [
'factories' => [
'GeoLocation\Service\GeoLocation' => 'GeoLocation\Service\GeoLocationFactory',
],
],
Тогда вы можете обновить свой AdvertService
требовать значение
class AdvertService
{
protected $location;
public function __construct($location)
{
$this->location = $location;
}
public function getAdvertsByCategory()
{
return $this->repository->countAdvertsByCategory($this->location);
}
}
Затем вы можете создать новый AdvertServiceFactory
который будет извлекать и вводить службу в AdvertService::__construct
с помощью
$serviceManager->get('GeoLocation\Service\GeoLocation');