2016-03-11 26 views
6

mam zainstalowane narzędzia Zend pomocą kompozytoraPHP Nieaktualne: Jesteś pobierania lokalizatora usług od wewnątrz klasy ZFTool Controller ModuleController

$ composer require zendframework/zftool:dev-master 

zftool został zainstalowany i gdy uruchomię php/VENDER/bin/ZF Lista modułów .php to ostrzeżenie o wyrzucaniu

PHP przestarzałe: Wyszukujesz lokalizator usług z klasy ZFTool \ Controller \ ModuleController. Należy pamiętać, że ServiceLocatorAwareInterface jest nieaktualny i zostanie usunięty w wersji 3.0 wraz z ServiceLocatorAwareInitializer. ...

używam Ubuntu

+0

Ten błąd występuje po aktualizacji zend. Uwierz mi, że szukałem rozwiązania z ostatnich 2 dni, a thr nie jest nawet jednym odpowiednim artykułem, który opisuje, jak rozwiązać ten problem. –

+0

Ten błąd również pojawia się i nie znalazłem rozwiązania lub zalecanego rozwiązania. –

Odpowiedz

6

Istnieje kilka rozwiązań:

  • W swojej error_reporting wyłączyć E_USER_DEPRECATED raportowanie. Ten po prostu maskuje problem.
  • Pin do wcześniejszej wersji zend-mvc (np. kompozytor wymaga "zendframework/zend-mvc:~2.6.0" przypiąć specjalnie do serii 2.6 i nie będzie instalował serii 2.7). Powoduje to po prostu maskowanie problemu i potencjalnie pozostawia niezabezpieczoną aplikację, jeśli poprawki zabezpieczeń zostaną zastosowane do późniejszego wydania mniejszej wersji zend-mvc.
  • Napraw swój kod, aby już nie używać getServiceLocator(). To jest zalecana ścieżka. Droga do osiągnąć ten ostatni punkt jest zapewnienie, że wszystkie zależności dla kontrolera są wstrzykiwane podczas wystąpienia.

To będzie oznaczać:

  • Musisz utworzyć fabryki dla swoich kontrolerów.
  • Będziesz musiał zaktualizować kontrolery, aby zaakceptować zależności w swoich konstruktorach, które wcześniej zostały pobrane z getServiceLocator(). Jako przykład, powiedzmy, że coś takiego w kontrolerze:

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

by zmienić swój kod w następujący sposób:

  • dodać obiekt $db do swojej klasy.
  • Zaktualizuj swój konstruktor, aby zaakceptował adapter bazy danych i przypisz go do właściwości.
  • Zmień powyższą linię na po prostu $db = $this->db (lub po prostu użyj właściwości!)
  • Dodaj fabrykę do kontrolera, jeśli jeszcze nie istnieje.

Więc:

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(/* ... */); 
     /* ... */ 
    } 
} 

Twoja fabryka będzie wyglądać mniej więcej tak:

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

W aplikacji lub konfiguracji modułu, byś na mapie fabrykę do kontrolera:

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

Może to wyglądać na wiele kroków. Zapewnia to jednak, że twój kod nie ma żadnych ukrytych zależności, poprawia testowalność twojego kodu i pozwala ci robić fajne rzeczy, takie jak zastępcze alternatywy poprzez konfigurację.

+0

Dzięki. To się udało. –

+0

Nie mogłem uruchomić tego, dopóki w drugim bloku kodu nie zmieniłem '$ this-> get ('' na '$ container-> getServiceLocator() -> get (''. –