2016-03-11 7 views
6

Я установил ZEND инструменты, используя композитор был установленPHP Устаревшее: Вы запрашиваете локатор службы из класса ZFTool Controller ModuleController

$ composer require zendframework/zftool:dev-master 

zftool и при запуске PHP/VENDER/bin/ZF .php перечисляет предупреждение о броске

PHP Устаревший: вы извлекаете локатор службы из класса ZFTool \ Controller \ ModuleController. Помните, что ServiceLocatorAwareInterface устарел и будет удален в версии 3.0 вместе с ServiceLocatorAwareInitializer. ...

Я использую Ubuntu

+0

Эта ошибка возникает после обновления вашего zend. Поверьте мне, я искал решение за последние 2 дня, и в трепе нет даже отдельной статьи, в которой описывается, как это решить. –

+0

Я также принимаю эту ошибку и не нашел решение или рекомендуемое решение. –

ответ

6

Есть несколько решений:

  • В вашем error_reporting, отключить E_USER_DEPRECATED отчетности. Это просто маскирует проблему.
  • Подключиться к более ранней версии zend-mvc (например, ). Композитор требует "zendframework/zend-mvc:~2.6.0", который будет указывать специально для серии 2.6 и не будет устанавливать серии 2.7). Это опять же просто маскирует проблему и потенциально может оставить ваше приложение незащищенным, если исправления безопасности будут применены к более поздней версии выпуска zend-mvc.
  • Исправьте код, чтобы больше не использовать getServiceLocator(). Это рекомендуемый путь. Путь к заключается в том, чтобы обеспечить выполнение всех зависимостей для вашего контроллера во время создания экземпляра.

Это будет означать:

  • Вам нужно создать заводы для контроллеров.
  • Вам необходимо будет обновить свои контроллеры, чтобы принимать зависимости в своих конструкторах, которые ранее были вытащены из getServiceLocator(). В качестве примера, предположим, что вы что-то вроде этого в контроллере:

$db = $this->getServiceLocator()->get('Db\ApplicationAdapter');

Вы могли бы изменить свой код следующим образом:

  • Добавить $db свойство к классу.
  • Обновите свой конструктор, чтобы принять адаптер базы данных, и назначьте его этому свойству.
  • Измените приведенную выше строку на просто $db = $this->db (или просто используйте это свойство!)
  • Добавьте фабрику для своего контроллера, если она не существует в настоящее время.

Итак:

use Zend\Db\Adapter\AdapterInterface; 
use Zend\Mvc\Controller\AbstractActionController; 

class YourController extends AbstractActionController 
{ 
    private $db; 

    public function __construct(AdapterInterface $db) 
    { 
     $this->db = $db; 
    } 

    public function someAction() 
    { 
     $results = $this->db->query(/* ... */); 
     /* ... */ 
    } 
} 

Ваш завод будет выглядеть примерно так:

class YourControllerFactory 
{ 
    public function __invoke($container) 
    { 
     return new YourController($this->get('Db\ApplicationAdapter')); 
    } 
} 

В приложении или конфигурации модуля, вы бы сопоставить этот завод к контроллеру:

return [ 
    'controllers' => [ 
     'factories' => [ 
      YourController::class => YourControllerFactory::class, 
     /* ... */ 
     ], 
     /* ... */ 
    ], 
    /* ... */ 
]; 
]; 

Это может показаться множеством шагов. Тем не менее, он гарантирует, что ваш код не имеет скрытых зависимостей, улучшает тестируемость вашего кода и позволяет вам делать классные вещи, такие как альтернативные альтернативы через конфигурацию.

+0

Спасибо. Это сработало. –

+0

Я не мог заставить это работать до тех пор, пока в вашем втором блоке кода я не изменил '$ this-> get ('' to '$ container-> getServiceLocator() -> get (''. –