# miniMVC 

miniMVC is a minimalistic Modular MVC framework, with built-in minifier, and pure-PHP templating system.

### Requirements
* PHP 5.4+
* PDO extensions for databases you wish to use
* Webserver that correctly handles REQUEST_URI, such as:
	* Apache
	* IIS
	* Lighttpd
* SimpleTest library for running unit tests

### Unique features
#### Extensive use of PHP's magic methods on the base class
* `__toString()` method allows a view of the current class object when the current class object is used as a string. If you prefer `var_dump()` or `var_export()`, you can pass the name of that function if you call the `__toString` method directly.
		
	Eg. `$this . "string"`, `$this->__toString()`, `echo $this`;

* `__call()` method allows the dynamic addition of callable closure objects 

	Eg. `$this->foo = function($baz){}` is callable as `$this->foo()`, with  the current object as the last argument
	
* `MM` class extends ArrayObject, and all the main classes extend this class. Functions begining with `array_` are callable on object from this class. E.g. `$this->array_keys()` will return a list of the class properties.

#### Database class is an extension of PHP's PDO class.

Database class uses [Query](https://github.com/aviat4ion/Query) as a database abstraction layer and query builder. 

Database connections are set in /app/config/db.php

### File Structure

* index.php - framework frontend

* app 		- configuration and app-wide files
	* classes	- helper classes
	* config	- configuration files
	* errors 	- error page templates
	* modules 	- MVC triads
		* controllers 	- controller classes
		* models		- model classes
		* views			- module-specific views 
	* views 	- global page templates
	

* assets 	- frontend files
	* js		- 	javascript files
	* css 		- 	css files
	* config  	-	minifier configuration files

* sys - core framework classes

### Common Tasks

* Creating a controller

		<?php 
		class Foo extends MM_Controller {
			
			function __construct()
			{
				parent::__construct();
			}
		}
* Creating a model

		<?php
		class Bar extends MM_Model {
		
			function __construct()
			{
				parent::__construct();
			}
		}

* Loading a database

	`$this->db = db::get_instance($db_name);`

	Note that multiple databases can be used in the same class
	by specifying a different database name. 

* Loading a model (From a controller)
	
	`$this->load_model($model)` - creates an instance of that model as a member of the current class. After loading the model, you can call its methods like so
	
	`$this->[model name]->method()`
	
* Loading a class
	`$this->load_class($class)` - creates an instance of that class as a member of the current class. After loading the class, you can call its methods like so
	
	`$this->[class name]->method()`