Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Função depreciada

Estou com problema na utilização do getServiceLocator

Apresenta o erro abaixo:

Deprecated: You are retrieving the service locator from within the class Estoque\Controller\IndexController. 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. in /Users/thales/Sites/zend/vendor/zendframework/zend-mvc/src/Controller/AbstractController.php on line 258

4 respostas

Oi Thales, tudo bom?

Você pode me mandar o código do seu IndexController?

<?php

namespace Estoque\Controller;

use Zend\Mvc\Controller\AbstractActionController; use Zend\View\Model\ViewModel; use Estoque\Entity\Produto;

class IndexController extends AbstractActionController {

public function indexAction() {

$entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $repositorio = $entityManager->getRepository('Estoque\Entity\Produto');

$produtos = $repositorio->findAll();

$view_params = array( 'produtos' => $produtos );

return new ViewModel($view_params); }

public function cadastrarAction() { if ($this->request->isPost()) { $nome = $this->request->getPost('nome'); $preco = $this->request->getPost('preco'); $descricao = $this->request->getPost('descricao');

$produto = new Produto(); $produto->setNome($nome); $produto->setPreco($preco); $produto->setDescricao($descricao);

$entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $entityManager->persist($produto); $entityManager->flush();

return $this->redirect()->toUrl('\estoque'); } return new ViewModel(); }

public function removerAction() { $id = $this->request->getPost('id'); if (is_null($id)) { $id = $this->params()->fromRoute('id'); } $entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $repositorio = $entityManager->getRepository('Estoque\Entity\Produto');

$produto = $repositorio->find($id);

if ($this->request->isPost()) { $entityManager->remove($produto); $entityManager->flush(); $this->redirect("\estoque"); } return new ViewModel(array('produto' => $produto)); }

public function editarAction() { $id = $this->params()->fromRoute('id'); $entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); $repositorio = $entityManager->getRepository('Estoque\Entity\Produto');

$produto = $repositorio->find($id);

if ($this->request->isPost()) { $nome = $this->request->getPost('nome'); $preco = $this->request->getPost('preco'); $descricao = $this->request->getPost('descricao');

$produto->setNome($nome); $produto->setPreco($preco); $produto->setDescricao($descricao);

$entityManager->persist($produto); $entityManager->flush(); $this->redirect("\estoque"); } return new ViewModel(array('produto' => $produto)); }

}

<?php

namespace Estoque\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Estoque\Entity\Produto;

class IndexController extends AbstractActionController {

    public function indexAction() {

        $entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        $repositorio = $entityManager->getRepository('Estoque\Entity\Produto');

        $produtos = $repositorio->findAll();

        $view_params = array(
            'produtos' => $produtos
        );

        return new ViewModel($view_params);
    }

    public function cadastrarAction() {
        if ($this->request->isPost()) {
            $nome = $this->request->getPost('nome');
            $preco = $this->request->getPost('preco');
            $descricao = $this->request->getPost('descricao');

            $produto = new Produto();
            $produto->setNome($nome);
            $produto->setPreco($preco);
            $produto->setDescricao($descricao);

            $entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
            $entityManager->persist($produto);
            $entityManager->flush();

            return $this->redirect()->toUrl('\estoque');
        }
        return new ViewModel();
    }

    public function removerAction() {
        $id = $this->request->getPost('id');
        if (is_null($id)) {
            $id = $this->params()->fromRoute('id');
        }
        $entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        $repositorio = $entityManager->getRepository('Estoque\Entity\Produto');

        $produto = $repositorio->find($id);

        if ($this->request->isPost()) {
            $entityManager->remove($produto);
            $entityManager->flush();
            $this->redirect("\estoque");
        }
        return new ViewModel(array('produto' => $produto));
    }

    public function editarAction() {
        $id = $this->params()->fromRoute('id');
        $entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        $repositorio = $entityManager->getRepository('Estoque\Entity\Produto');

        $produto = $repositorio->find($id);

        if ($this->request->isPost()) {
            $nome = $this->request->getPost('nome');
            $preco = $this->request->getPost('preco');
            $descricao = $this->request->getPost('descricao');

            $produto->setNome($nome);
            $produto->setPreco($preco);
            $produto->setDescricao($descricao);

            $entityManager->persist($produto);
            $entityManager->flush();
            $this->redirect("\estoque");
        }
        return new ViewModel(array('produto' => $produto));
    }

}
solução!

Tive que usar o Factory para o controller. E então poder usar o EntityManager.

Pois foi depreciado na ZF3.

<?php

namespace Estoque\Controller\Factory;

use Doctrine\ORM\EntityManager;
use Estoque\Entity\Produto;
//use Interop\Container\ContainerInterface;
use Zend\ServiceManager\AbstractPluginManager;

use Estoque\Controller\IndexController;

class IndexControllerFactory {

    /**
     * @param AbstractPluginManager $pluginManager
     *
     * @return IndexController
     */
    public function __invoke(AbstractPluginManager $pluginManager) {
        $container = $pluginManager->getServiceLocator();

        $entityManager = $container->get(EntityManager::class);
//        $repositorio = $entityManager->getRepository(Produto::class);

        return new IndexController($entityManager);
    }

}

E no Controller usei desta forma:

class IndexController extends AbstractActionController {

    private $objectManager;

    public function __construct(ObjectManager $objectManager) {
        $this->objectManager = $objectManager;
    }

    public function indexAction() {
        $pagina = $this->params()->fromRoute('page', 1);
        $qtdePorPagina = 5;
        $offset = ($pagina - 1) * $qtdePorPagina;

        $repository = $this->objectManager->getRepository('Estoque\Entity\Produto');
        $produtos = $repository->getProdutosPaginados($qtdePorPagina, $offset);

        $view_params = array(
            'qtdePorPagina' => $qtdePorPagina,
            'produtos' => $produtos
        );

        return new ViewModel($view_params);
    }