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');
Другие вопросы по тегам