我创建了一个显示广告的项目。每个广告都有一个位置。
目前是显示广告的列表。我现在想要在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);
}
但是,如果我现在删除我的地理位置模块,而不是我的应用程序模块中的工厂来创建我的导航会失败,这意味着我的工厂现在依赖于我不想要的这个新模块。我怎么能避免这个?
答案 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');