Vegetus
Vegetus

Reputation: 733

MVC - Can I call more than one (or multiple) controller in class controller?

For projects written in php, can I call more than one (or multiple) controller in class controller? Example in http://img192.imageshack.us/img192/7538/mvc03.gif

ASK: I need to call an action from another controller... And if I do like the picture above, I'm being out-ethics?

Thanks, Vinicius.

Upvotes: 1

Views: 2148

Answers (5)

Anthony Rutledge
Anthony Rutledge

Reputation: 7564

If you are building another Controller, then feel that you need to access the functionality of a previous Controller to access its functionality (because it works with a specific / desired Model), then the Model you developed for the latter probably needs to be refactored. IN plain speak, your target Model may be doing too much. Break it up.

You are trying to avoid repeating yourself (DRY) by using calling the methods of a Controller that has already been developed, but in doing so your are creating TIGHT coupling between both controllers! If something changes in the borrowed controller, it will have an effect on the borrowing controller. Not good, Dr. Jones.

Upvotes: 0

Demian Brecht
Demian Brecht

Reputation: 21368

I'm sure that you can do what you want with whichever framework you're using. If you can't do it natively for whatever reason, then you can extend your framework as required.

Having said that, I personally don't like the idea of a controller calling another controller. It seems to somewhat break the MVC paradigm if only from a theoretical standpoint. What I might do instead is build a library class that contains the functionality required and then have both controllers instantiate that class as a member and call the functions required.

For example, using CodeIgniter:

libraries/MyLib.php:

class MyLib
{
    public function MyFunc()
    { /* do whatever */ }
}

controllers/ControllerA.php:

class ControllerA extends Controller
{
    public function index()
    { 
        $this->load->library('MyLib');
        $this->mylib->MyFunc();
    }
}

controllers/ControllerB:

class ControllerB extends Controller
{
    public function index()
    {
        $this->load->library('MyLib');
        $this->mylib->MyFunc();
    }
}

Upvotes: 2

webbiedave
webbiedave

Reputation: 48897

out-ethics? Anywhose... back to reality.

Yes, a controller can call another controller's action. For instance, in cakePHP, this functionality is afforded via requestAction

// pass uri to request action and receive vars back
$ot3 = $this->requestAction('/stories/xenu');

If you're rolling your own, the details of how to implement it will be very specific to your framework.

Upvotes: 1

DampeS8N
DampeS8N

Reputation: 3621

You can do it any way that you want. You don't have to use MVC if you don't want to. However, in MVC you really should only have one controller active at a time. You probably want multiple Views or Models, not another Controller. There is nothing at all wrong in loading, say, a header and footer view for the menu and footer of the site.

Upvotes: 0

Edmhs
Edmhs

Reputation: 3731

then you need to modify framework, find place where controller is lounched and add there your second controller.

what framework you are using?

Upvotes: 0

Related Questions