zend framework - PHP desaprobado: está recuperando el localizador de servicios de la clase ZFTool / Controller / ModuleController
zend-framework zend-tool (1)
Hay algunas soluciones:
- En su error_reporting, desactive el informe
E_USER_DEPRECATED
. Esto simplemente enmascara el problema. - Pin a una versión anterior de zend-mvc (p. Ej., El compositor requiere
"zendframework/zend-mvc:~2.6.0"
fijará específicamente en la serie 2.6 y no instalará la serie 2.7). Esto, una vez más, simplemente enmascara el problema y posiblemente dejará su aplicación insegura si se aplican parches de seguridad a una versión menor posterior de zend-mvc. - Arregle su código para que ya no use
getServiceLocator()
. Esta es la ruta recomendada. La forma de lograr este último punto es garantizar que todas las dependencias de su controlador se inyecten durante la creación de instancias.
Esto significará:
- Necesita crear fábricas para sus controladores.
- Necesitará actualizar sus controladores para aceptar dependencias en sus constructores que se
getServiceLocator()
previamente degetServiceLocator()
. Como ejemplo, digamos que tienes algo como esto en tu controlador:
$db = $this->getServiceLocator()->get(''Db/ApplicationAdapter'');
Cambiarías tu código de la siguiente manera:
- Agregue una propiedad
$db
a su clase. - Actualice su constructor para aceptar el adaptador de base de datos y asígnelo a la propiedad.
- Cambie la línea de arriba a simplemente
$db = $this->db
(¡o simplemente use la propiedad!) - Agregue una fábrica para su controlador, si no existe actualmente.
Asi que:
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(/* ... */);
/* ... */
}
}
Tu fábrica se vería así:
class YourControllerFactory
{
public function __invoke($container)
{
return new YourController($this->get(''Db/ApplicationAdapter''));
}
}
En su aplicación o configuración de módulo, debe asignar esta fábrica a su controlador:
return [
''controllers'' => [
''factories'' => [
YourController::class => YourControllerFactory::class,
/* ... */
],
/* ... */
],
/* ... */
];
];
Esto puede parecer un montón de pasos. Sin embargo, garantiza que su código no tenga dependencias ocultas, mejora la capacidad de prueba de su código y le permite hacer cosas geniales como alternativas sustitutivas a través de la configuración.
He instalado herramientas zend usando compositor
$ composer require zendframework/zftool:dev-master
zftool ha sido instalado y cuando ejecuto php /vender/bin/zf.php lista de módulos está lanzando advertencia
PHP en desuso: está recuperando el localizador de servicios dentro de la clase ZFTool / Controller / ModuleController. Tenga en cuenta que ServiceLocatorAwareInterface está en desuso y se eliminará en la versión 3.0, junto con ServiceLocatorAwareInitializer. ...
Estoy usando Ubuntu