Чтобы показать, как использовать класс 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 ниже).