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);
}
}