Zend Framework:使用控制器方法来调用模型方法

时间:2014-04-06 12:00:28

标签: php zend-framework2 zend-view zend-controller

我在这里遇到了一些问题。我对DB中的每个产品都有category_id。我在DB中也有类别表及其ID。现在我需要一起考虑。我已经制作了添加,编辑和删除操作,也显示了操作,其中的类别显示了产品描述的其余部分。但现在我对索引操作有问题。

在节目中我这样做了:

public function getProductTable()
 {
    if (!$this->productTable) {
         $sm = $this->getServiceLocator();
         $this->productTable = $sm->get('Product\Model\ProductTable');
     }
     return $this->productTable;
 }

public function getCategoryTable() {
    if(!$this->categoryTable){
        $this->categoryTable = $this->getServiceLocator()
            ->get('Product\Model\CategoryTable');
    }
    return $this->categoryTable;
}

 public function showAction()
 {
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
         return $this->redirect()->toRoute('product', array(
             'action' => 'add'
         ));
    }

    try {
         $product = $this->getProductTable()->getProduct($id);
         $category = $this->getCategoryTable()->getCategory($product->category_id);
     }
     catch (\Exception $ex) {

         return $this->redirect()->toRoute('product', array(
             'action' => 'index'
         ));
     }

这很简单,因为在showAction期间我将从DB获得一个结果,所以我确切知道category_id产品有什么。

但是,在index.phtml中,我将从DB中获取所有产品,并且需要在foreach中迭代它们。那是我需要接听电话的地方

$this->getCategoryTable()->getCategory($id);

因为这是使用sm来使用模型方法的控制器方法,我应该如何在index.phtml视图中使用它来获取每个产品的确切类别名称?

3 个答案:

答案 0 :(得分:1)

调用查询以单独获取每个产品的类别名称是非常低效的,而是编写一个方法,该方法将返回由CategoryTable类中的id键入的类别名称数组

public function getCategoryNames()
{
     // query to get list of names and ids

     // return array of category names, keyed by id
     $categories = array();
     foreach ($results as $result) {
          $categories[$result['id']] = $result['name'];
     }
     return $categories;
}

在控制器操作中调用方法并将结果传递给视图...

public function indexAction()
{
    $categories = $this->getCategoryTable()->getCategoryNames();
    $products = $this->getProductTable()->getProducts();
    return new ViewModel(array(
        'categories' => $categories,
        'products' => $products,
    ));
}

在您看来,您可以循环播放您的产品,只需通过id数组中的$categories键访问类别名称

// index.phtml
<ul>
<?php foreach ($products as $product) : ?>
    <li>Product category  name is : <?= $categories[$product->category_id]; ?></li>
<?php endforeach; ?>
</ul>

结果只是两次db调用,而不是一次调用get产品,然后另外调用以获取每个产品项的类别名称。

答案 1 :(得分:0)

一切正常,但我会为其他人添加,当我使用你的例子时,它会引发错误:

  

无法将对象类型用作数组

发生了这种情况,因为我的查询未返回$result['id']$result['name'] 因为我正在使用TableGateway,它确实返回$result->id$result->name所以最终函数看起来像这样:

public function getCategoryNames()
{
    $results = $this->fetchAll();
    $categories = array();

    foreach ($results as $result) {
        $categories[$result->id] = $result->name;
    }

    return $categories;
}

正如Crisp所说,其他一切都运作良好:)

非常感谢Crisp:)

答案 2 :(得分:0)

好吧,我认为您可以直接将结果呈现到视图中,因为我们都在与MVC一起工作,因为所有逻辑都在控制器上使用,而且有时您需要在独立组件上分割工作,所以这样做有点不干净为此,您创建了一个函数,就像我的朋友一样,在我之前,他们提供了语法,因此您将编写类似

public function name of your function()
{
    //fetching the result of your model query them all or one 
    return your result 

}

在您看来,您将必须获取值并打印结果