Jump to content

Zend controller reuse


gethinw

Recommended Posts

Hi all,

 

I'm just starting out with Zend and am trying to get my head round a few concepts.

 

Basically, I have a site with a number of different pages (realised as controllers), each of which pulls data from a different database table and displays it. So, the site structure is something like this:

 

public/

  /news

  /biography

  /links

 

 

However, a few of these pages do the same thing to the data of their respective tables, and I was wondering how I'd go about reducing the amount of duplicated code. Something along the lines of:

 

class BasicController extends Zend_Controller_Action
{
//reusable code in here, using a variable $name
}

---------
class BiographyController extends BasicController
{
//passes 'biography' to $name variable
}

----------
class LinksController extends BasicController
{
//passes 'links' to $name variable
}

 

So, that's the idea, is that a sensible way of going about this? And how would I go about actually passing the variable?

 

Hope that that's clear - let me know if it's not, or if any more information would be useful!

 

Thanks,

Gethin

Link to comment
Share on other sites

Never did this, but something like this should help:

 

class BasicController extends Zend_Controller_Action
{
    public static $variable = '';

    public function init()
    {
        self::$variable = 'assign value';
    }
}

class BioController extends BasicController
{
    public function indexAction()
    {
        $bioVar = parrent::$variable;
    }
}

 

Link to comment
Share on other sites

Ah yes, that's almost what I'm looking for, but wanting to do it the other way - pass the variable from BioController to BasicController. I've got this at the moment, but it doesn't seem to work:

 

abstract class ATCController extends Zend_Controller_Action
{
  public static $tableName = '';

  public function indexAction()
  {
    $this->view->headTitle(ucfirst($tableName));
    $model = $this->_getModel();
    $this->view->content = $model->fetchRow()->Text;
  }

  protected function _getModel()
  {
    if (null === $this->_model) {
      // autoload only handles "library" compoennts.  Since this is an 
      // application model, we need to require it from its application 
      // path location.
      require_once APPLICATION_PATH . '/models/ATCTable.php';
      $this->_model = new ATCTable(array('name' => $tableName));
    }
    return $this->_model;
  }
}

---------------------------

class BiographyController extends ATCController
{
  public function indexAction()
  {
    parent::$tableName = 'biography';
    parent::indexAction();
  }
}

Link to comment
Share on other sites

Sorted, in case anyone is interested:

 

abstract class ATCController extends Zend_Controller_Action
{

  abstract protected function _getName(); //to get table name from child classes

  public function indexAction()
  {
    $this->view->headTitle(ucfirst($this->_getName()));
    $model = $this->_getModel();
    $this->view->content = $model->fetchRow()->Text;
  }

  protected function _getModel()
  {
    if (null === $this->_model) {
      // autoload only handles "library" compoennts.  Since this is an 
      // application model, we need to require it from its application 
      // path location.
      require_once APPLICATION_PATH . '/models/ATCTable.php';
      $this->_model = new ATCTable(array('name' => strtolower($this->_getName())));
    }
    return $this->_model;
  }
}

------------------

class BiographyController extends ATCController
{
  protected function _getName()
  {
    return 'biography';
  }
}

Link to comment
Share on other sites

  • 9 months later...

if you want to pass a variable to another controller, u can use either of the ff:

_redirect()

_forward()  // works if you want to pass an array

 

 

class BasicController extends Zend_Controller_Action

{

    public function indexAction()

    {

          $name    =  "alex";

          $arrName = array (

              'firsname'  => "myFirstName",

              'lastname => "myLastName");

 

        // if you want to pass variable name:

        //STRUCTURE: controller/action/variableName/value

        $this->_redirect('bio/index/name/$name");

 

        //if you intend to pass an array:

        //STRUCTURE:  'action', 'controller', $array

        $this->_forward('index', 'bio', $arrName);         

    }

}

 

-----------------------------

class BioController extends Zend_Controller_Action

{

    public function indexAction()

    {

        //for sample #1

        $name = $this->getRequest()->getParam(''name');       

    }

}

 

 

 

hope this could help.  :D

Link to comment
Share on other sites

True you can do just that but it's the duplicate code that we want to limit. Now I tend to create a controller with all the trimings needed especially if it's going to be the normal "C.R.U.D" structure.  So Check it I would make a controller with like this.

 

Now this is just a shell for it. but the $_model will be called and initialized as the model. Depending on you Model Structure.

 

I tend to not follow Conventional structures but to keep code simple and easy to read for my projects I abstract and refactor repetative code into functions in the controller.

 

I function 1 code 1 fix.

 

class baseController extends Zend_Controller_Action{

  private $_model;

 

  public function init(){}

 

  public function createAction(){}

 

 

  public function editAction(){}

 

 

  public function deleteAction(){}

 

  public function indexAction(){}

 

}

 

 

if you want to pass a variable to another controller, u can use either of the ff:

_redirect()

_forward()  // works if you want to pass an array

 

 

class BasicController extends Zend_Controller_Action

{

    public function indexAction()

    {

          $name    =  "alex";

          $arrName = array (

              'firsname'  => "myFirstName",

              'lastname => "myLastName");

 

        // if you want to pass variable name:

        //STRUCTURE: controller/action/variableName/value

        $this->_redirect('bio/index/name/$name");

 

        //if you intend to pass an array:

        //STRUCTURE:  'action', 'controller', $array

        $this->_forward('index', 'bio', $arrName);         

    }

}

 

-----------------------------

class BioController extends Zend_Controller_Action

{

    public function indexAction()

    {

        //for sample #1

        $name = $this->getRequest()->getParam(''name');       

    }

}

 

 

 

hope this could help.  :D

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.