Zend Framework 2:在Module.php中设置Cookie以从其他模块访问

时间:2015-06-24 15:11:30

标签: zend-framework2

我创建了一个显示广告的项目。每个广告都有一个位置。

目前是显示广告的列表。我现在想要在layout.phtml中找到一个位置列表,然后点击广告后应该过滤广告。

为实现这一目标,我创建了一个名为Geolocation的新模块。然后我创建了两个新的视图助手;一个显示所有位置,另一个显示所选位置的名称,该名称存储在Cookie中。

当您单击列表中的某个位置时,您将访问地理定位控制器的AJAX请求。控制器调用服务中的方法以将位置存储在cookie中。

我现在正在将我的广告模块中的SQL查询和存储库更改为接受位置(如果已设置):

public function countAdvertsByCategory($location=false)

通常情况下,我会在广告控制器中添加$location = $_COOKIE['ChosenCounty'],但我相信还有更好的方法。

我原以为我可以在Geolocation Module的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);
  }

但是,如果我现在删除我的地理位置模块,而不是我的应用程序模块中的工厂来创建我的导航会失败,这意味着我的工厂现在依赖于我不想要的这个新模块。我怎么能避免这个?

1 个答案:

答案 0 :(得分: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');