2015-06-24 50 views
1

我創建了一個項目來顯示廣告。每個廣告都有一個位置。Zend Framework 2:Ho在Module.php中設置Cookie以訪問其他模塊

當前列表是否顯示廣告。我現在想要在我的layout.phtml中找到位置列表,並在點擊廣告後進行過濾。

爲了實現這一點,我創建了一個名爲Geolocation的新模塊。然後我創建了兩個新的視圖助手;一個顯示所有位置,另一個顯示所選位置的名稱,該位置存儲在Cookie中。

當您點擊列表中的某個位置時,您將訪問對地理位置控制器的AJAX請求。控制器調用服務中的方法將位置存儲在cookie中。

我現在改變我的SQL查詢和存儲庫在我的廣告模塊接受的位置,如果它被設置:

public function countAdvertsByCategory($location=false) 

通常情況下,我會在我的廣告控制器添加$location = $_COOKIE['ChosenCounty'],但我相信有一個更好的方法。

我原以爲我可以在地理定位模塊的module.php中加入這個。如果該模塊包含該變量,則將使用該cookie值設置$location,否則它將被忽略。

這是正確的方法還是最佳實踐?我該怎麼做?

UPDATE

我現在已經改變了我廠:

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

您可以將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); 
    } 
} 

然後,您可以使用

$serviceManager->get('GeoLocation\Service\GeoLocation'); 
+0

感謝這麼創建一個新的AdvertServiceFactory,將提取和注入服務到AdvertService::__construct很多爲您的答案。我會嘗試你的解決方案,但我不確定我會管理它,看看我已經構建了我的源代碼到目前爲止......所有非常混亂,我不得不承認它還沒有點擊。 – Luka

+0

我得到它的工作,但...看到我上面的更新 – Luka