Para mostrar como usar la clase EntityManager
crearemos la página principal para
la aplicación web Blog. Esta página mostrará la lista de publicaciones ordenada
por la fecha de creación de manera descendente.
Para hacer esto agregamos el método constructor y el método indexAction()
en la
clase de tipo controlador IndexController
de la siguiente manera:
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Entity\Post;
class IndexController extends AbstractActionController
{
/**
* Entity manager.
* @var Doctrine\ORM\EntityManager
*/
private $entityManager;
// Constructor method is used to inject dependencies to the controller.
public function __construct($entityManager)
{
$this->entityManager = $entityManager;
}
// This is the default "index" action of the controller. It displays the
// Posts page containing the recent blog posts.
public function indexAction()
{
// Get recent posts
$posts = $this->entityManager->getRepository(Post::class)
->findBy(['status'=>Post::STATUS_PUBLISHED],
['dateCreated'=>'DESC']);
// Render the view template
return new ViewModel([
'posts' => $posts
]);
}
}
En el código de arriba primero agregamos el método constructor __construct()
que
se usa para inyectar el administrador de entidades de Doctrine dentro del controlador
(líneas 17-20).
Dentro del método indexAction()
traemos el repositorio de las entidades Post
con el método del administrador de entidades getRepository()
(línea 27). Con
el método findBy()
que provee el repositorio seleccionamos las publicaciones
publicadas ordenadas por fecha en orden descendiente. En la línea 32 pasamos
las publicaciones seleccionadas a la vista para imprimirla.
Luego creamos la factory para el IndexController
. Para hacer esto agregamos el
archivo IndexControllerFactory.php dentro de la carpeta Controller/Factory en
el directorio fuente del módulo. Colocamos el siguiente código en el archivo:
<?php
namespace Application\Controller\Factory;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\Controller\IndexController;
/**
* This is the factory for IndexController. Its purpose is to instantiate the
* controller.
*/
class IndexControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container,
$requestedName, array $options = null)
{
$entityManager = $container->get('doctrine.entitymanager.orm_default');
// Instantiate the controller and inject dependencies
return new IndexController($entityManager);
}
}
En el código de arriba podemos ver como instanciar el administrador de entidades de Doctrine e inyectarlo dentro del controlador.
No olvidemos registrar nuestro controlador de tipo factory dentro del archivo
module.config.php
. Para hacer esto agregamos lo siguiente:
//...
return [
//...
'controllers' => [
//...
'factories' => [
Controller\IndexController::class =>
Controller\Factory\IndexControllerFactory::class,
],
],
//...
];
Luego modificamos la plantilla de vista index.phtml en la carpeta application/index dentro directorio view del módulo y colocamos el siguiente contenido dentro de ella:
<h1>Posts</h1>
<?php foreach($posts as $post): ?>
<h3>
<a href="#">
<?= $this->escapeHtml($post->getTitle()); ?>
</a>
</h3>
<p>
<?= $this->escapeHtml($post->getContent()); ?>
</p>
<?php endforeach; ?>
En la plantilla de vista de arriba recorremos las publicaciones que seleccionamos e imprimimos el título y contenido de cada una. Así de simple!
Ahora si abrimos la aplicación web Blog en nuestro navegador deberíamos ver la siguiente página que contiene la lista de las publicaciones (veamos la figura 12.6 abajo).