我有一个带有fetchSingle(返回1记录)和dbase的fetchAll(全部返回)方法的CategoryController。
现在我想重新使用de fetchall方法进行导航。
最好的方法是什么?
以下代码:
Module.php
public function getServiceConfig()
{
return array(
'factories' => array(
/*
* Category Table
*/
'CategoryTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
return new TableGateway('category', $dbAdapter, null, $resultSetPrototype);
},
'CategoryTable' => function($sm) {
$tableGateway = $sm->get('CategoryTableGateway');
$table = new Model\CategoryTable($tableGateway);
return $table;
},
),
);
}
CategoryController:
namespace Front\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class CategoryController extends AbstractActionController
{
protected $categoryTable;
function indexAction() {
//$slug = $this->getEvent()->getRouteMatch()->getParam('slug');
$this->layout()->setVariable('metatitle', 'title1');
$this->layout()->setVariable('metadescription', 'description2');
$this->layout()->setVariable('metakeywords', 'keywords3');
return new ViewModel(array(
'category' => $this->getCategories(),
));
}
public function getCategory( $slug ){
return $this->getTable()->getCategory($slug);
}
public function getCategories(){
return $this->getTable()->getCategories();
}
public function getTable()
{
if (!$this->categoryTable) {
$sm = $this->getServiceLocator();
$this->categoryTable = $sm->get('CategoryTable');
}
return $this->categoryTable;
}
}
CategoryModel:
namespace Front\Model;
use Zend\Db\TableGateway\TableGateway;
class CategoryTable {
protected $tableGateway;
public function __construct(TableGateway $tableGateway)
{
$this->tableGateway = $tableGateway;
}
public function getCategory($slug)
{
$resultSet = $this->tableGateway->select(array('name' => $slug));
$resultSet = $resultSet->toArray();
return $resultSet[0];
}
public function getCategories()
{
$resultSet = $this->tableGateway->select();
$resultSet = $resultSet->toArray();
return $resultSet;
}
}
答案 0 :(得分:1)
如果您想拥有导航元素,可以从自定义视图管理器开始。帮助程序将加载类别并构建导航菜单。
视图助手可以如下所示:
namespace MyApp\View\Helper;
use MyApp\Repository\CategoryRepository;
use Zend\Navigation\Navigation;
use Zend\View\Helper\AbstractHelper;
class CategoryMenu
{
protected $repository;
public function __construct(CategoryRepository $repository)
{
$this->repository = $repository
}
public function __invoke(array $options = array)
{
$categories = $this->repository->fetchAll();
$container = $this->buildNavigation($categories);
$navigation = $this->getView()->navigation();
return $navigation->menu()->renderMenu($container, $options);
}
private function buildNavigation(array $categories)
{
$pages = [];
foreach ($categories as $category) {
$pages[] = [
'label' => $category->getName(),
'route' => 'categories/view',
'params' => ['id' => $category->getId()]
];
}
return new Navigation($pages);
}
}
这个助手需要一个存储库(在控制器中不使用fetchSingle()
或fetchAll()
,它们是映射器/存储库方法!)。当您调用帮助程序时,它会从数据库中获取所有类别,构建导航对象并调用导航视图帮助程序将其呈现到菜单中。
我没有写下所有粘合部件,但是你需要一个像样的存储库,这样你就可以访问数据库和这个视图助手的工厂了。然后在模块配置中注册视图助手。
来自$options
的{{1}}被传递到菜单帮助器,因此您可以在那里应用选项(例如,ulClass,最小/最大深度等)。用法:__invoke()
。
注意我尝试将所有类别链接到一个页面,但我错过了您的问题中的信息。我假设路由<div><?= $this->categoryMenu([])?></div>
存在,并且它需要参数categories/view
作为类别ID。更新id
方法以满足您自己的需求。
答案 1 :(得分:0)
如果您瞄准最佳方法,您的控制器不应该从数据库中获取任何内容。这是一项服务(更好)的数据层(最佳)工作。您需要在服务器中使用该服务,同时使用服务中的存储库(数据层)的fetch / fetchAll方法。
当您将fetch和fetchAll逻辑作为专用方法移动到专用类中时,您将轻松弄清楚如何重用它们并且问题变为&#34;我如何将我的x服务注入到我的CategoryController中?&#34;
我建议你专注于阅读一些关于separating of concerns等主题的文章。