Lightweight (M)VC structure for Slim applications.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Slim MVC

Slim is one of the best PHP Frameworks(IMHO), but sometimes is annoying for people who like to write webapps in MVC strucuture to adapt to Slim structure, then if you're bored of using Slim application structure , you should consider give a try to this project.

The aim of this project is provide a very basic MVC structure to organize your Slim apps.

Getting started

1 - First of all , clone this repository , now this will be your slim project base.
2 - Move on clone directy and run curl -sS | php && php composer.phar install in the root dir.

App configuration flow

So, you've cloned the repository and can wait to start hacking ? Yeah!!

Let me introduce a few things : most of MVC job is done by routes_helper.php inside libs folder and base_controller.php in app/controllers folder, if you're curious about how it works, check it out, i'm sure that you'll understand , they're small.

1 - Adding a new route

You can simple add a new route in app/config/routes.php file by using :

// The first param is the controller, and seconds is a array of urls
Router\Helper::map("pages", array(
	"(/|/home/?)" 		=> array("get" 	=> "home" , "post" => "home"),	
	"/terms/?"   		=> array("get" 	=> "terms")					 ,
	"/submit/?"			=> array("post" => "submit_form")		 	 ,

// News controller (app/controllers/news_controller.php)
Router\Helper::map("news", array(
    "/news/:permalink"  => array("get" => "news_show"),
    "/news/page/:page"  => array("get" => "news_pagination")

Above, you see that is very easy to attach urls to controllers, but it's expensive sometimes to write one-by-one url, if you want to do a CRUD for a resource, use :

// Creating CRUD actions to users model
Router\Helper::mapCRUD("users" , array(
    "confirm_account/:email_token/?" => array("get" => "confirm_account"),
	"set_password/(:token)/?"  => array("get" => "set_password" , "put" => "update_password")

// This will create the urls and map to `users_controller.php` actions :
// [GET]    /users/         => UsersController#index
// [GET]    /users/:id/     => UsersController#edit
// [GET]    /users/:id/edit => UsersController#show
// [GET]    /users/new/     => UsersController#new
// [POST]   /users/         => UsersController#create
// [PUT]    /users/         => UsersController#update
// [DELETE] /users/:id/     => UsersController#destroy

// The second parameter its called 'extras' routes, and will generate :

// [GET]    /users/set_password/:token => UsersController#set_password
// [PUT]    /users/set_password/:token => UsersController#update_password

2 - Create controller
Now, create the file app/controllers/pages_controller.php :

class PagesController extends BaseController {

	protected function _home() {
		$this->page_title = 'Home';
		// simulating a model that brings the latest posts
		$posts  = Posts::recents() ;
		// you can pass multiples params by the way, of course (see _terms action below)
		$this->view_params('posts' , $posts);

	protected function _terms() {
		$this->page_title = 'Our terms';
		// you can pass all kind of value to view
			'terms_text' => \SomeAPI::call('get' , 'terms'),
			'terms_date' => \SomeAPI::call('get' , '')

	protected function _submit() {
		// do cool stuff with $_POST, $_FILES :)

2.1 - News controller example : app/controllers/news_controller.php

class NewsController extends BaseController {

	// this function is EVER called before all others
	public function _init() {

	protected function _news_show() {
		/* Fetch database and load specific news by permalink */

	protected function _news_pagination() {
		// do news pagination


3 - Create view :
Until now you have routes and controllers configureds, to finish the flow create a view:

<h1>Our terms of services</h1>

<div class='terms-of-service'>
	<?php echo $params['terms_text'] ?> <!-- From controller -->

4 - Boostraping App : Create index.php and make sure you load app/config/bootstrap.php file. Default index.php :

class MyApp {
	public static function __init() {
		// current dir 
		define("ROOT" , __DIR__); 
 		// Load bootstrap
		require_once ROOT . "/app/config/bootstrap.php";

		AppBootstrap::init(); // init bootstrap

MyApp::__init() ; // init app


  • Better documentation
  • Tests
  • Add Models examples


The project is licensed under the MIT license. See LICENSE file for details.

How to Contribute

Pull Requests

1 Fork the slim-mvc repository 2. Create a new branch for each feature or improvement 3. Send a pull request from each feature branch to the develop branch