Приложение 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) Начните новый запрос из Помощника просмотра, чтобы вернуть то, что мне нужно, или B) Используйте функцию, называемую getUser()
из класса User/Module/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); ?>