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ę.
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. –
Ten błąd również pojawia się i nie znalazłem rozwiązania lub zalecanego rozwiązania. –