В приложении Zend Framework 2 есть представление, в котором я отображаю журнал событий в простом табличном формате. Я использую несколько базовых помощников вида для управления представлением данных в таблице, но в этих существующих помощниках вида вся логика содержится в самом помощнике вида, например:
namespace Application\View\Helper;
use Zend\View\Helper\AbstractHelper;
class GetSystemName extends AbstractHelper
{
public function __invoke($val)
{
if ($val == 0){
return 'Something';
}
if ($val == 1){
return 'Something else';
}
}
}
Мое требование состоит в том, чтобы построить функцию GetUserName
принять user_id
и выполнить проверку базы данных для отображения имени пользователя, так как идентификатор не имеет значения для человека, использующего систему.
Как я это вижу, я могу либо:
A) Запустите новый запрос из помощника вида, чтобы вернуть то, что мне нужно, или
Б) Используйте функцию под названием getUser()
из модуля «Пользователь» / UserTable
учебный класс.
Код для B:
namespace User\Model;
use Zend\Db\TableGateway\TableGateway;
class UserTable
{
protected $tableGateway;
public function __construct(TableGateway $tableGateway)
{
$this->tableGateway = $tableGateway;
}
//..other functions
public function getUser($id)
{
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
return $row;
}
Какой самый лучший вариант? И как бы я это реализовал?
Извиняюсь, если это основные вопросы, я новичок в MVC и Zend.
в модель-представление-контроллер шаблон, Посмотреть не должны знать о модель слой. Информация от моделей вводится в поле зрения через контроллер.
Наличие в вашей модели помощника вида вызова метода getUser () нарушает этот шаблон.
Ну так что ты делаешь?
Пусть ваш контроллер отобразит информацию о пользователе:
// controller
$userId = $this->params()->fromQuery("userID");
// or from session ID if this is a private profile page
// You might want some validation, too...
$userTable = $this->getServiceLocator()->get("UserTable");
// or whatever you've configured in the service config for this
$user = $userTable->getUser($userId);
// if this is a public profile page, you might want to
// exclude some fields like "password" so they don't
// accidentally get into the view
$view = new ViewModel();
$view->setVariable("user", $user);
return $view;
Затем в view.phtml вы просто делаете:
<?php $this->GetSystemName($user->whateverField); ?>
Других решений пока нет …