A free and open-source book on ZF3 for beginners


12.8. Добавление главной страницы блога

Чтобы показать, как использовать класс EntityManager, мы создадим главную страницу для веб-приложения Blog. Эта страница будет выводить список постов, отсортированных по дате в порядке убывания.

Для этого добавим конструктор и метод indexAction() в класс контроллера IndexController следующим образом:

<?php
namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Entity\Post;

class IndexController extends AbstractActionController 
{
    /**
     * Менеджер сущностей.
     * @var Doctrine\ORM\EntityManager
     */
    private $entityManager;
  
    // Метод конструктора, используемый для внедрения зависимостей в контроллер.
    public function __construct($entityManager) 
    {
        $this->entityManager = $entityManager;
    }
  
    // Действие по умолчанию "index". Оно отображает страницу 
    // Posts, содержащую последние посты блога.
    public function indexAction() 
    {
        // Получаем недавние посты.
        $posts = $this->entityManager->getRepository(Post::class)
                     ->findBy(['status'=>Post::STATUS_PUBLISHED], 
                              ['dateCreated'=>'DESC']);
        
        // Визуализируем шаблон представления.
        return new ViewModel([
            'posts' => $posts
        ]);
    }
}

В приведенном выше фрагменте мы сперва добавляем метод конструктора __construct(), который используется для внедрения менеджера сущностей Doctrine в контроллер (строки 16-19).

Внутри метода indexAction() мы получаем репозиторий сущностей Post методом менеджера сущностей getRepository() (строка 26). С помощью метода findBy(), предоставляемого репозиторием, мы выбираем опубликованные посты, отсортированные по дате в порядке убывания. Далее, в строке 31 мы передаем выбранные посты представлению для визуализации.

Теперь создадим фабрику для IndexController. Для этого добавьте файл IndexControllerFactory.php в каталог Controller/Factory под корневым каталогом модуля. Поместите следующее содержимое в этот файл:

<?php
namespace Application\Controller\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\Controller\IndexController;

/**
 * Это фабрика для IndexController. Ее целью является инстанцирование
 * контроллера.
 */
class IndexControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, 
                     $requestedName, array $options = null)
    {
        $entityManager = $container->get('doctrine.entitymanager.orm_default');
        
        // Инстанцируем контроллер и внедряем зависимости.
        return new IndexController($entityManager);
    }
}

В фрагменте кода выше мы инстанцировали менеджер сущностей Doctrine и внедрили его в контроллер.

Не забудьте зарегистрировать фабрику контроллера в файле module.config.php. Для этого добавьте следующий код:

//...
return [
    //...
    'controllers' => [
        //...
        'factories' => [
            Controller\IndexController::class => 
                            Controller\Factory\IndexControllerFactory::class,    
        ],
    ],
    //...
];

Далее, добавьте следующее содержимое в файл шаблона представления index.phtml в каталоге application/index под каталогом модуля view:

<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; ?>

В этом шаблоне представления мы проходит по выбранным постам по очереди и визуализируем заголовок и содержимое каждого. Настолько просто!

Теперь, если вы откроете веб-приложение Blog в своем браузере, вы должны будете увидеть такую страницу, содержащую список постов (см. рисунок 12.6 ниже).

Рисунок 12.6. Список постов Рисунок 12.6. Список постов


Top