zend framework documentacion php zend-framework zend-framework2 deprecated zend-framework3

php - documentacion - zend framework vs laravel



Obsoleto: Recuperar el localizador de servicio en el sistema funcional-ZF2 (2)

No tienes que hacer nada, todavía . Cuando actualice a ZF3, tendrá que cambiar la forma en que su clase de controlador recibe sus dependencias.

ZF2 admite dos patrones de inyección de dependencia: por localizador de servicio y por constructor. ZF3 elimina "por ubicación de servicio" y requiere "por constructor". Todo lo que hace, efectivamente, es cambiar cómo se resuelven las dependencias, moviendo la resolución de "justo a tiempo" a "en construcción".

En lugar de poder obtener un servicio desde cualquier lugar , en su lugar los recibes en la construcción . Actualiza tu código a lo largo de las siguientes líneas:

namespace Module/Controller; class Controller { public function __construct(/Module/Service/Service $service) { $this->service = $service; } }

Use el servicio $this->service donde lo necesite en los métodos de la clase.

Luego use una fábrica de controladores para crear su controlador, así:

function ($controllers) { $services = $controllers->getServiceLocator(); return new /Module/Controller/Controller($services->get(''Module/Service/Service'')); }

El cambio se analiza en el Issue 5168 , y esta publicación de blog explica por qué la inyección de servicios con un localizador de servicios es un antipatrón.

Estoy desarrollando un sistema ZF2 y estaba funcionando muy bien, pero después de clonar el repositorio en otra computadora, apareció este error obsoleto:

Está recuperando el localizador de servicios desde la clase Module / Controller / Controller. Tenga en cuenta que ServiceLocatorAwareInterface está en desuso y se eliminará en la versión 3.0, junto con ServiceLocatorAwareInitializer. Deberá actualizar su clase para aceptar todas las dependencias en la creación, ya sea mediante argumentos de constructor o instaladores, y usar una fábrica para realizar las inyecciones. en /home/path/project/vendor/zendframework/zend-mvc/src/Controller/AbstractController.php en la línea 258

El compositor.json:

"require": { "php": ">=5.5", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", "zendframework/zendframework": "~2.5", "doctrine/doctrine-orm-module": "0.*", "hounddog/doctrine-data-fixture-module": "0.0.*", "imagine/Imagine": "~0.5.0"

El error aparece cuando recupero el servicio en mis controladores (extendiendo Zend / Mvc / Controller / AbstractActionController):

$this->getServiceLocator()->get("Module/Service/Service");

En el núcleo Zend en Zend / Mvc / Controller / AbstractController es así:

public function getServiceLocator() { trigger_error(sprintf( ''You are retrieving the service locator from within the class %s. Please be aware that '' . ''ServiceLocatorAwareInterface is deprecated and will be removed in version 3.0, along '' . ''with the ServiceLocatorAwareInitializer. You will need to update your class to accept '' . ''all dependencies at creation, either via constructor arguments or setters, and use '' . ''a factory to perform the injections.'', get_class($this) ), E_USER_DEPRECATED); return $this->serviceLocator; }

Antes solo era esto:

public function getServiceLocator() { return $this->serviceLocator; }

Lo he intentado todo, ¿alguien sabe lo que tengo que hacer?


Puede crear un servicio de complemento de controlador () (pero es una mala práctica, prefiere FactoryInterface)

module.config.php

''controller_plugins'' => [ ''factories'' => [ ''service'' => YourNamespace/Mvc/Controller/Plugin/Service/ServiceFactory::class, ], ],

YourNamespace / Mvc / Controller / Plugin / Service / ServiceFactory.php

<?php namespace YourNamespace/Mvc/Controller/Plugin/Service; use Interop/Container/ContainerInterface; use YourNamespace/Mvc/Controller/Plugin/Service; use Zend/ServiceManager/Factory/FactoryInterface; class ServiceFactory implements FactoryInterface { /** * @param ContainerInterface $container * @param string $requestedName * @param array $options * @return Service */ public function __invoke(ContainerInterface $container, $requestedName, array $options = null) { $plugin = new Service(); $plugin->setServiceLocator($container); return $plugin; } }

YourNamespace / Mvc / Controller / Plugin / Service.php

<?php namespace YourNamespace/Mvc/Controller/Plugin; use Interop/Container/ContainerInterface; use Zend/Mvc/Controller/Plugin/AbstractPlugin; /** * Plugin: $this->service(); */ class Service extends AbstractPlugin { /** * @var ContainerInterface */ protected $serviceLocator; /** * @return ContainerInterface */ public function getServiceLocator() { return $this->serviceLocator; } /** * @param ContainerInterface $serviceLocator * @return Service */ public function setServiceLocator(ContainerInterface $serviceLocator) { $this->serviceLocator = $serviceLocator; return $this; } /** * @param string $name * @return object|bool */ public function __invoke($name = null) { $sl = $this->getServiceLocator(); if (!$name) { return $sl; } if (!$sl->has($name)) { return false; } return $sl->get($name); } }