Zend2导航全局布局

时间:2014-12-26 07:51:47

标签: php zend-framework zend-framework2

我有一个带有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;
}

}

2 个答案:

答案 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等主题的文章。