A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

12.8. Agregar la Página Home del Blog

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).

Figura 12.6. Lista de las publicaciones Figura 12.6. Lista de las publicaciones


Top