Zend MVC:从控制器到模型的一次调用或更多调用不同的结果?

时间:2012-12-17 16:08:21

标签: php zend-framework zend-framework-mvc

我需要从模型得到不同的结果,但我不明白是否正确进行单个调用并留下建模所有工作或进行更多调用并收集结果以在表未加入时传递给视图或者当我需要从表中获取一行并从其他表中获取不同的行时。

第一个例子(更多的电话,收集和发送到视图):

CONTROLLER

// call functions of model
$modelName = new Application_Model_DbTable_ModelName();
$rs1 = $modelName->getTest($var);
$rs2 = $modelName->getTest2($var2);

// collect data
$pippo = $rs1->pippo;
if ($rs2->pluto == 'test') {
    $pluto = 'ok';
} else {
    $pluto = 'ko';
}

// send to view
$this->view->pippo = $pippo;
$this->view->pluto = $pluto;

MODEL

public function getTest($var) {
...
select from db...
return $result;
...
}


public function getTest2($var) {
...
select from db...
return $result;
...
}

第二个例子(一次调用,模型收集所有数据,返回控制器并发送到视图):

CONTROLLER

// call one function of model
$modelName = new Application_Model_DbTable_ModelName();
$rs = $modelName->getTest($var);

MODEL

public function getTest($var) {
...
select from db...

if ($result > 0) {
    call other function
    call other function
    collect data
    return $result;
    ...
}

由于

2 个答案:

答案 0 :(得分:2)

这个问题没有一个正确的答案,但总的来说,你应该努力将你的业务逻辑保持在一个地方。可以把它想象成“薄控制器,厚模型”。即,保持控制器尽可能小而简单,并将所有业务逻辑放在模型中。

答案 1 :(得分:0)

这里似乎有几个问题:

  

但如果我不需要与db交互,我只需要一个简单的   函数最好把这个函数放在模型中?例如:   控制器:

public function printAction() {
    $data = $this->getRequest()->getPost(); 
    $label = "blablabla"; 
    $this->view->label = $label;       
}

首先,在Zend Framework的上下文中,这个特定的例子没有多大意义。控制器的重点是填充视图模板。但是,我确实明白了。我会指出Action HelpersView helpers作为解决您问题的方法。您总是可以在库中添加一个实用程序类,用于那些似乎不适合其他任何地方的代码片段。

Action Helpers通常用于封装可能重复或可重用的控制器代码。它们可以根据需要简单或复杂,这是一个简单的例子:

class Controller_Action_Helper_Login extends Zend_Controller_Action_Helper_Abstract
{
    /**
     * @return \Application_Form_Login
     */
    public function direct()
    {
        $form = new Application_Form_Login();
        $form->setAction('/index/login');

        return $form;
    }
}

//add the helper path to the stack in the application.ini
resources.frontController.actionhelperpaths.Controller_Action_Helper = APPLICATION_PATH "/../library/Controller/Action/Helper"

//the helper is called in the controller
$this->_helper->login();

View helper对视图模板执行相同的操作:

class Zend_View_Helper_PadId extends Zend_View_Helper_Abstract
{
    /**
     * add leading zeros to value
     * @param type $id
     * @return string
     */
    public function padId($id)
    {
        return str_pad($id, 5, 0, STR_PAD_LEFT);
    }
}

//in this example the helper path is added to the stack from the boostrap.php
 protected function _initView()
    {
        //Initialize view
        $view = new Zend_View();
        //add custom view helper path
        $view->addHelperPath('/../library/View/Helper');
        //truncated for brevity
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
                'ViewRenderer');
        $viewRenderer->setView($view);
        //Return it, so that it can be stored by the bootstrap
        return $view;
    }
//and to use the helper in the view template
//any.phtml
<?php echo $this->padId($this->id) ?>
  

我需要从模型中获得不同的结果,但我不明白它是否存在   正确拨打一个电话并留下来模拟所有工作或制作   更多调用并收集结果以在表时传递给视图   没有加入或当我需要从表中获取一行和不同   来自其他人的行。

这个问题更多的是关于结构然后关于正确性。

如果需要,您可以在Action和View帮助程序中与数据库表模型进行交互,以获得简单/重复查询,但是大多数开发人员可能会对此方法感到厌倦,因为难以维护或只是丑陋。

许多人似乎赞成DoctrinePropel来帮助他们管理数据库需求。

此时我喜欢自己动手,目前更喜欢域模型和数据映射器,而不是所有模式,但似乎适合你的问题。

这不是第一次实施的简单建议,但我发现有两篇文章有助于入门:

http://phpmaster.com/building-a-domain-model/

http://phpmaster.com/integrating-the-data-mappers/

如果你真的想进入它,请尝试:

http://survivethedeepend.com/

我希望这至少能回答你的一部分问题。