Есть несколько решений:
- В вашем 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,
/* ... */
],
/* ... */
],
/* ... */
];
];
Это может показаться множеством шагов. Тем не менее, он гарантирует, что ваш код не имеет скрытых зависимостей, улучшает тестируемость вашего кода и позволяет вам делать классные вещи, такие как альтернативные альтернативы через конфигурацию.
Эта ошибка возникает после обновления вашего zend. Поверьте мне, я искал решение за последние 2 дня, и в трепе нет даже отдельной статьи, в которой описывается, как это решить. –
Я также принимаю эту ошибку и не нашел решение или рекомендуемое решение. –