user1910413
user1910413

Reputation: 91

Zend MVC: one call from controller to model or more calls for differents results?

i need differents results from a model but i don't understand if it is correct make a single call and leave to model all the work or make more calls and collect the result to pass to the view when tables aren't joined or when i need fetch one row from a table and differents rows from others.

First example (more calls, collect and send to view):

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;
...
}

Second example (one call, model collect all data, return to controller and send to view):

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;
    ...
}

Thanks

Upvotes: 0

Views: 354

Answers (2)

RockyFord
RockyFord

Reputation: 8519

There seems to be a few questions here:

But if i don't need to interact with db and i need only a simply function is better put that function in model? For example: CONTROLLER:

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

first, in the context of Zend Framework this particular example doesn't make much sense. The whole point of the controller is to populate the view template. However, I do get the idea. I would point you to Action Helpers and View helpers as a means to address your concerns. You can always add a utility class to your library for those pieces of code that don't seem to fit anywhere else.

Action Helpers typically are employed to encapsulate controller code that may be repetitive or reusable. They can be as simple or as complex as required, here is a simple example:

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();

a View helper does the same thing for the view templates:

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) ?>

i need differents results from a model but i don't understand if it is correct make a single call and leave to model all the work or make more calls and collect the result to pass to the view when tables aren't joined or when i need fetch one row from a table and differents rows from others.

This question is more about structure then about correctness.

You can interact with your database table models in Action and View helpers for simple/repetitive queries if you need to, however most developers might frown on this approach as being difficult to maintain or just ugly.

Many people seem to favor Doctrine or Propel to help them manage their database needs.

At this point I like to roll my own and currently favor domain models and data mappers, not an end all be all pattern, but seems to be appropriate to your question.

This is not a simple suggestion to implement for the first time, however i found two articles helpful to get started:

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

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

and if you really want to get into it try:

http://survivethedeepend.com/

I hope this answers at least a part of your questions.

Upvotes: 0

Alex Howansky
Alex Howansky

Reputation: 53656

There's no one correct answer to this question, but in general, you should endeavor to keep your business logic in one place. Think of it as, "thin controller, thick model." I.e., keep the controllers as small and simple as possible and put all the business logic in the models.

Upvotes: 2

Related Questions