 <blockquote> <p>Am I missing something? How can I achieve the same thing in CodeIgniter?</p> <blockquote> <p><sub>if you want to learn how to truly approach MVC in PHP, you can learn it from Tom Butler <a href="http://r.je" rel="nofollow">articles</a></sub></p> </blockquote> </blockquote> <p>CodeIgniter implements Model-View-Presenter pattern, not MVC (even if it says so). If you want to implement a truly MVC-like application, you're on the wrong track.</p> <p>In MVP:</p> <ul> <li>View can be a class or a html template. View should never be aware of a Model.</li> <li>View should never contain business logic</li> <li>A Presenter is just a glue between a View and the Model. Its also responsible for generating output.</li> </ul> <blockquote> <blockquote> <p>Note: A model should never be <em>singular class</em>. Its a number of classes. I'll call it as "Model" just for demonstration.</p> </blockquote> </blockquote> <p>So it looks like as:</p> <pre><code>class Presenter { public function __construct(Model $model, View $view) { $this-&gt;model = $model; $this-&gt;view = $view; } public function indexAction() { $data = $this-&gt;model-&gt;fetchSomeData(); $this-&gt;view-&gt;setSomeData($data); echo $this-&gt;view-&gt;render(); } } </code></pre> <p>In MVC:</p> <ul> <li>Views are not HTML templates, but classes which are responsible for presentation logic</li> <li>A View has direct access to a Model</li> <li>A Controller should not generate a response, but change model variables (i.e assign vars from <code>$_GET</code> or <code>$_POST</code></li> <li>A controller should not be aware of a view</li> </ul> <p>For example,</p> <pre><code>class View { public function __construct(Model $model) { $this-&gt;model = $model; } public function render() { ob_start(); $vars = $this-&gt;model-&gt;fetchSomeStuff(); extract($vars); require('/template.phtml'); return ob_get_clean(); } } class Controller { public function __construct(Model $model) { $this-&gt;model = $model; } public function indexAction() { $this-&gt;model-&gt;setVars($_POST); // or something like that } } $model = new Model(); $view = new View($model); $controller = new Controller($model); $controller-&gt;indexAction(); echo $view-&gt;render(); </code></pre>