PHP-MVC Project: Encouraging Model-View-Control application structure
The PHP-MCV Project is a set of scripts that encourage the use of Model-View-Control application structure. There’s an advanced version that also comes with automatic SASS compiling and additional Twig support.
MINI
MINI is an extremely simple and easy to understand skeleton PHP application, reduced to the max. MINI is NOT a professional framework and it does not come with all the stuff real frameworks have. If you just want to show some pages, do a few database calls and a little-bit of AJAX here and there, without reading in massive documentations of highly complex professional frameworks, then MINI might be very useful for you. MINI is easy to install, runs nearly everywhere and doesn't make things more complicated than necessary.For a deeper introduction into MINI have a look into this blog post: MINI, an extremely simple barebone PHP application.
Features
- extremely simple, easy to understand
- simple but clean structure
- makes "beautiful" clean URLs
- demo CRUD actions: Create, Read, Update and Delete database entries easily
- demo AJAX call
- tries to follow PSR 1/2 coding guidelines
- uses PDO for any database requests, comes with an additional PDO debug tool to emulate your SQL statements
- commented code
- uses only native PHP code, so people don't have to learn a framework
Forks of MINI
TINY
MINI has a smaller brother, named TINY. It's similar to MINI, but runs without mod_rewrite in nearly every environment. Not suitable for live sites, but nice for quick prototyping.MINI2
MINI also has a bigger brother, named MINI2. It's even simpler, has been built using Slim and has nice features like SASS-compiling, Twig etc.Requirements
- PHP 5.3.0+
- MySQL
- mod_rewrite activated (tutorials below, but there's also TINY, a mod_rewrite-less version of MINI)
Installation (in Vagrant, 100% automatic)
If you are using Vagrant for your development, then you can install MINI with one click (or one command on the command line) [Vagrant doc]. MINI comes with a demo Vagrant-file (defines your Vagrant box) and a demo bootstrap.sh which automatically installs Apache, PHP, MySQL, PHPMyAdmin, git and Composer, sets a chosen password in MySQL and PHPMyadmin and even inside the application code, downloads the Composer-dependencies, activates mod_rewrite and edits the Apache settings, downloads the code from GitHub and runs the demo SQL statements (for demo data). This is 100% automatic, you'll end up after +/- 5 minutes with a fully running installation of MINI2 inside an Ubuntu 14.04 LTS Vagrant box.To do so, put
Vagrantfile
and bootstrap.sh
from _vagrant
inside a folder (and nothing else).
Do vagrant box add ubuntu/trusty64
to add Ubuntu 14.04 LTS ("Trusty Thar") 64bit to Vagrant (unless you already have
it), then do vagrant up
to run the box. When installation is finished you can directly use the fully installed demo
app on 192.168.33.44
. As this just a quick demo environment the MySQL root password and the PHPMyAdmin root password
are set to 12345678
, the project is installed in /var/www/html/myproject
. You can change this for sure inside
bootstrap.sh
.Auto-Installation on Ubuntu 14.04 LTS (in 30 seconds)
You can install MINI including Apache, MySQL, PHP and PHPMyAdmin, mod_rewrite, Composer, all necessary settings and even the passwords inside the configs file by simply downloading one file and executing it, the entire installation will run 100% automatically. Find the tutorial in this blog article: Install MINI in 30 seconds inside Ubuntu 14.04 LTSInstallation
- Edit the database credentials in
application/config/config.php
- Execute the .sql statements in the
_install/
-folder (with PHPMyAdmin for example). - Make sure you have mod_rewrite activated on your server / in your environment. Some guidelines: Ubuntu 14.04 LTS, Ubuntu 12.04 LTS, EasyPHP on Windows, AMPPS on Windows/Mac OS, XAMPP for Windows, MAMP on Mac OS
Server configs for
nginx
server {
server_name default_server _; # Listen to any servername
listen [::]:80;
listen 80;
root /var/www/html/myproject/public;
location / {
index index.php;
try_files /$uri /$uri/ /index.php?url=$uri;
}
location ~ \.(php)$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Security
The script makes use of mod_rewrite and blocks all access to everything outside the /public folder. Your .git folder/files, operating system temp files, the application-folder and everything else is not accessible (when set up correctly). For database requests PDO is used, so no need to think about SQL injection (unless you are using extremely outdated MySQL versions).Goodies
MINI comes with a little customized PDO debugger tool (find the code in application/libs/helper.php), trying to emulate your PDO-SQL statements. It's extremely easy to use:$sql = "SELECT id, artist, track, link FROM song WHERE id = :song_id LIMIT 1";
$query = $this->db->prepare($sql);
$parameters = array(':song_id' => $song_id);
echo Helper::debugPDO($sql, $parameters);
$query->execute($parameters);
License
This project is licensed under the MIT License. This means you can use and modify it for free in private or commercial projects.Support
If you want to support MINI, then rent your next server at Host1Plus. Thanks! :)My blog
And by the way, I'm also blogging at Dev Metal.Quick-Start
The structure in general
The application's URL-path translates directly to the controllers (=files) and their methods inside application/controllers.example.com/home/exampleOne
will do what the exampleOne() method in application/controllers/home.php says.example.com/home
will do what the index() method in application/controllers/home.php says.example.com
will do what the index() method in application/controllers/home.php says (default fallback).example.com/songs
will do what the index() method in application/controllers/songs.php says.example.com/songs/editsong/17
will do what the editsong() method in application/controllers/songs.php says and
will pass 17
as a parameter to it.Self-explaining, right ?
Showing a view
Let's look at the exampleOne()-method in the home-controller (application/controllers/home.php): This simply shows the header, footer and the example_one.php page (in views/home/). By intention as simple and native as possible.public function exampleOne()
{
// load view
require APP . 'views/_templates/header.php';
require APP . 'views/home/example_one.php';
require APP . 'views/_templates/footer.php';
}
Working with data
Let's look into the index()-method in the songs-controller (application/controllers/songs.php): Similar to exampleOne, but here we also request data. Again, everything is extremely reduced and simple: $this->model->getAllSongs() simply calls the getAllSongs()-method in application/model/model.php.public function index()
{
// getting all songs and amount of songs
$songs = $this->model->getAllSongs();
$amount_of_songs = $this->model->getAmountOfSongs();
// load view. within the view files we can echo out $songs and $amount_of_songs easily
require APP . 'views/_templates/header.php';
require APP . 'views/songs/index.php';
require APP . 'views/_templates/footer.php';
}
public function getAllSongs()
{
$sql = "SELECT id, artist, track, link FROM song";
$query = $this->db->prepare($sql);
$query->execute();
return $query->fetchAll();
}
<tbody>
<?php foreach ($songs as $song) { ?>
<tr>
<td><?php if (isset($song->artist)) echo htmlspecialchars($song->artist, ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php if (isset($song->track)) echo htmlspecialchars($song->track, ENT_QUOTES, 'UTF-8'); ?></td>
</tr>
<?php } ?>
</tbody>
History
MINI is the successor of php-mvc. As php-mvc didn't provide a real MVC structure (and several people complained about that - which is totally right!) I've renamed and rebuild the project.Dear haters, trolls and everything-sucks-people...
... MINI is just a simple helper-tool I've created for my daily work, simply because it was much easier to setup and to handle than real frameworks. For daily agency work, quick prototyping and frontend-driven projects it's totally okay, does the job and there's absolutely no reason to discuss why it's "shit compared to Laravel", why it does not follow several MVC principles or why there's no personal unpaid support or no russian translation or similar weird stuff. The trolling against Open-Source-projects (and their authors) has really reached insane dimensions.I've written this unpaid, voluntarily, in my free-time and uploaded it on GitHub to share. It's totally free, for private and commercial use. If you don't like it, don't use it. If you see issues, then please write a ticket (and if you are really cool: I'm very thankful for any commits!). But don't bash, don't complain, don't hate. Only bad people do so.
Contribute
Please commit into the develop branch (which holds the in-development version), not into master branch (which holds the tested and stable version).Phpmvc
GitHub: https://github.com/panique/php-mvc