2013-02-12 4 views
3

У меня есть класс модели, который не расширяет основной модуль Zend. Эта модель была импортирована из моего предыдущего приложения Zend Framework 1. Я могу вызвать его методы, переведя его в пространство имен. Проблема в том, что у меня есть чтение глобальной конфигурации в стороне от определенных методов.Zend framework 2 доступ к глобальной конфигурации в классе модели

В случае контроллера я был в состоянии получить доступ к глобальной конфигурации с помощью кода ниже

$config = $this->getServiceLocator()->get('config'); 

// This gives a union of global configuration along with module configuration . 

Но что мы должны сделать, чтобы получить доступ к конфигурации, показанной на стороне класса модели. Ниже, как моя модель класса

<?php 
namespace test\Http; 

class Request 
{ 

    protected $client; 

    public function abc($c) 
    { 
     return $something; 
    } 


    ...... 

} 

Я новичок в рамках Zend 2, пожалуйста, любезно предложить какой-либо метод для достижения этой цели.

В приведенном выше описании модель означает (модель модели MVC), которая имеет в ней некоторую бизнес-логику.

+0

Что именно вы имеете в виду под «моделью» здесь? Сущность? Вероятно, вы не должны этого делать, если это вопрос. Подумайте, что вы можете достичь глобальной конфигурации везде, где у вас есть ссылка на локатор сервисов ... – Ocramius

+0

@Ocramius Спасибо, что ответили на это, у меня есть класс модели (просто класс, который имеет бизнес-логику) –

+0

Так это сервис? Или просто объект, содержащий данные + некоторую логику? – Ocramius

ответ

3

Предполагая, что вы строите свою службу (ваш код выглядит как сервис), вы, вероятно, создать его экземпляр в сервисной фабрике (в данном случае, я положил его в модуле конфигурации):

class MyModule 
{ 
    public function getServiceConfig() 
    { 
     return array(
      'factories' => array(
       'my_request_object' => function (
        \Zend\ServiceManager\ServiceLocatorInterface $sl 
       ) { 
        $config = $sl->get('config'); 

        return new \GaGooGl\Http\Request($config); 
       }, 
      ), 
     ); 
    } 
} 

Этого Кстати, вы вводите объект конфигурации непосредственно в своего потребителя (без ссылки на локатор обслуживания у потребителя)

Другой способ - реализовать Zend\ServiceManager\ServiceLocatorAwareInterface в вашем GaGooGl\Http\Request. I personally discourage it, но это в основном позволяет вам иметь свой объект Request, чтобы он содержал ссылку на локатор службы внутри, что позволяет получить услугу config во время выполнения.

+0

Нужно ли это определить в файле module.php –

+0

Как получить объект конфигурации в классе модели, на самом деле я согласен с вами говорят, чтобы вернуть объект конфигурации. –

+0

У вас не может быть объекта конфигурации без доступа к локатору службы.Либо передайте объект конфигурации на заводе (это закрытие, которое я написал выше), в ваш объект 'Request', либо передайте' $ sl' в объект 'Request' (чтобы затем объект' Request' мог получить к нему доступ, чтобы получить '' config'' service) – Ocramius

0

Проверить this. Он имеет два решения. Один реализует интерфейс, поддерживающий локатор службы. Другой заключается в том, чтобы ввести менеджера сервисов в вашу модель. Для обоих вам необходимо создать экземпляр объекта модели через диспетчера служб.

0

простой способ сделать это

$config = new \Zend\Config\Config(include APPLICATION_PATH.'/config/autoload/global.php'); 
+2

Я бы назвал это * взломать *. – Alex

Смежные вопросы