Dan
Dan

Reputation: 12096

Is a POST controller suitable in a php mvc?

I am creating a custom MVC style framework from scratch and am at the point where I need to implement the code to control what happens on POST.

At the moment I have a main index.php which acts as a controller and passes data to other controllers such as:

profilecontroller.class.php forumcontroller.class.php

At the moment I see two options as to where the POST controllers can go ..

First Approach

Firstly for site wide posts such as login that can occur on any page I would use something like this in the very first index.php to redirect all POST to a specific POST controller that then sends the data to a model to be processed:

if($_POST)
    //post controller, works on specific form id's

Alternate Approach

The other option I see would be to build the POST identifier into the model construction sections but I don't think this would be very manageable/wise as they'd always be checked and resulting in more loaded code?

Are there any good/simple examples out there?

I'm creating my mvc to be as light as possible so that's my reason for going from scratch.

Upvotes: 0

Views: 2393

Answers (2)

Martin Bean
Martin Bean

Reputation: 39429

In a RESTful setup, you would normally have a controller for an object, say news, and then actions such as add, edit, delete etc.

Within your actions, you should then assert what HTTP method should be used to access the method, if one should be. For example:

<?php
class NewsController extends AbstractController {
    public function save() {
        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
            header('HTTP/1.1 405 Method Not Allowed');
            die('Please use POST.');
        }
        // carry on knowing we're working with a POST request
    }
}

Creating a separate controller for POST requests would, as you say, quickly becoming unruly and unmanageable.

If you're looking for a way of handling requests for different HTTP methods within different controller actions, then maybe check out ToroPHP. It's a lightweight (single file) router, where you map a request to a class that's referred to as a handler, and then that handler has methods for different HTTP methods. A quick example:

<?php

require 'lib/torophp/toro.php';
require 'classes/handlers/HomeHandler.php';

$toro = new ToroApplication(array(
    array('/', 'HomeHandler')
));
$toro->serve();

And then your HomeHandler would look as follows:

<?php
class HomeHandler {
    public function get() {
        echo 'Hello, world!';
    }
    public function post() {
        echo 'Try performing a GET request for the home page, buddy.';
    }
    // and so on...
}

Hope that helps.

Upvotes: 3

David B&#233;langer
David B&#233;langer

Reputation: 7438

This is my default Controller :

<?php
Class Controller_Home{
    public $Registery = null;

    final public function __construct($Registery){ $this->Registery = $Registery; }

    final public function Init($Method=null){
        # Quelle action on fait ?
        if($Method){
            $Split = explode('_', $Method);

            $MethodName = 'Action';
            foreach($Split as $Splitted){
                $MethodName.= '_'.ucfirst($Splitted);
            }

            if(method_exists($this, $MethodName)){
                $this->$MethodName();
            } else {
                echo '404';
                die;
            }
        } else {
            $this->Action_Default();
        }
    }

    final public function Action_Default(){
        $this->Registery->Import('Library.Account');

        var_dump($this->Registery->Account);
        echo 'Default Home';
    }
}

As you can see, once you are in Action_Default, you can do whatever you want based on $_GET, $_POST, whatever you want ...

So with this code :

website.com/home/bob/ will use function Action_Bob inside the controller Home (Home::Action_Bob) ... if you see $_POST just put inside Action_Bob this

public function Action_Bob(){
    if($_POST){
        $this->Action_Bob_Post();
    }
    // continue
}

Upvotes: 0

Related Questions