2014-12-26 193 views
0

我有一個類別控制器與dbase的fetchSingle(返回1記錄)和fetchAll(返回所有)方法。Zend2導航全局佈局

現在我想重新使用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

你想要例如在每個頁面上列出的所有類別,或使用Zend \ Navigation列出某些指定頁面上的所有這些類別? –

+0

@JurianSluiman嗨Jurian,是的,我有一個dbtable類別,我想做一個導航。我看到你可以在配置中根據導航數組創建一個,但我想從數據庫中取出它。我已經有一個類的類工作,現在我想讓導入控制器的een實例,並顯示在layout.phtml – Bas

+0

@JurianSluiman,thnx爲您的答覆!看起來不錯,只有一件我不明白的是存儲。這與我的類別模型相同,我已經擁有或者是不同的存儲空間。你能舉一個例子或解釋嗎? – Bas

回答

1

如果你想在你身邊有一個導航元素,你可以從一個自定義視圖heler開始。助手將加載類別並構建導航菜單。

視圖助手可以是這樣的:

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__invoke()傳遞到菜單助手,因此您可以在其中應用選項(如ulClass,最小/最大深度等)。用法:<div><?= $this->categoryMenu([])?></div>

注意我試圖將所有類別鏈接到一個頁面,但我錯過了您的問題中的信息。我假設這裏存在路線categories/view,它需要參數id作爲分類id。更新buildNavigation()方法以適應您自己的需求。

0

如果目標的最佳途徑,你controlle rs不應該從數據庫中獲取任何東西。這是一個服務(更好)數據層(最好)的工作。您需要使用服務器中的該服務,同時使用服務中的存儲庫(數據層)的fetch/fetchAll方法。

將fetch和fetchAll邏輯作爲專用方法移動到專用類中時,您將很容易找出如何重用它們,並且問題變爲「我如何將我的x服務注入到我的類別控制器?

我建議您專注於閱讀關於separating of concerns等主題的文章。

+0

thnx您的回覆@foozy。我已經分開控制器,模塊和視圖。但是現在我想創建一個擴展categorycontroller類的新類Navigation。我如何解決這個問題。 – Bas