From Spaghetti to MVC
Hanafiah Yahya
Who is Hanafiah Yahya?
Our Awesome Programs
Kreydle Academy
Kreydle Academy
http://www.kreydle.com/academy/
Topics
Survey
Topics
Spaghetti
http://www.venicecafechicago.com/wp-content/uploads/2014/07/venicea01.jpg
Why Spaghetti? - metaphor
Things get really messy when connecting each other
back to the invention of
http://i144.photobucket.com/albums/r166/Funnyoldlife/tin-can-telephone.jpg
A
B
Spaghetti
A
B
C
Spaghetti
A
B
C
D
E
F
Spaghetti
A
B
C
D
E
F
G
H
I
J
Spaghetti
A
B
C
D
E
F
G
H
I
J
Formula
# Phones | # Lines/ Connections |
2 | 1 |
3 | 3 |
4 | 6 |
5 | 10 |
10 | 45 |
20 | 190 |
1000 | ? |
Formula
# Phones | # Lines |
10 | 45 |
20 | 190 |
1000 | 499,500 |
Formula
#Lines = ( p * ( p - 1 ) ) / 2
*p = phone
Where is my server?
Spaghetti Code
1) Spaghetti code is a specific [ goto 8 ]
2) written in order, but splattered [ goto 9 ]
3) allowed to jump to a specific [ goto 7 ]
4) the goto statement, which [ goto 3 ]
5) a set of instructions is not [ goto 2 ]
6) spaghetti. It often refers to [ goto 4 ]
7) line of code. [ end ]
8) kind of bad coding, where [ goto 5 ]
9) all over the place ( like a knotted [ goto 6 ] )
Solution?
Solution? better design pattern
HUB
Result
# Phones | # Lines |
2 | 1 |
3 | 3 |
4 | 6 |
5 | 10 |
10 | 45 |
20 | 190 |
1000 | 499,500 |
# Phones | # Lines |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
10 | 10 |
20 | 20 |
1000 | 1000 |
Original Refactor
MVC Heroes
http://www.helenbrowngroup.com/wp-content/uploads/2014/09/info-pro-as-superman.jpg
Enough Theory!
Lets see some code
SQL Query
DB Connection
SQL Query
HTML Code
Business Logic
Presentation
Presentation
Spaghetti Code
Topics
History
Invented in 1979 by Smalltalk programmers, Trygve Reenskaug
It is software design pattern
History
1979?.. so old
Made popular by Ruby On Rails
initial release on 2005 and
adapted by PHP community
Why MVC?
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
- Represent Knowledge
- Manages data, logic and rules of the application.
- Business Logic
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
- The output, whats user see.
- Visual represent of the Model
- Presentation layer
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
the middleman / link between user and the system
The flow
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Topics
http://www.makemark.co.uk/wp-content/uploads/2011/05/infooverload_full.jpg
PHP MVC Frameworks
Topics
Why CodeIgniter
Why not CakePHP or Laravel or Symfony or FuelPHP or YII or Zend Framework or Kohana or Zoop or Akelos or PHP on Trax or Prado or Seagull or …?
Why CodeIgniter
Because you’ve gotta pick one
That being said, CI is
not dead!
CodeIgniter
CodeIgniter is a powerful PHP framework with a very small footprint, built for developers who need a simple and elegant toolkit to create full-featured web applications.
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Topics
Config - database
application/config/database.php
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => ‘master_php’,
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
<?php
$host = 'localhost';
$dbname = 'master_php';
$user = 'root';
$pass = '';
try {
// Connecting to MySQL
$dbh = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
Config - autoload
application/config/autoload.php
Topics
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Models
application/models/m_users.php
Model - Get all users
<?php�public function get_users()�{� $query = $this->db->get('users');� return $query->result();�}
<?php�// Get all users�$stmt = $dbh->prepare("SELECT * FROM users");�$stmt->setFetchMode(PDO::FETCH_ASSOC);�if ($stmt->execute()) {� while ($row = $stmt->fetch()) {
Model - Add new user
<?php�public function insert()�{� $this->name = $this->input->post('name'); // similar to $_POST['name']; � $this->age = $this->input->post('age');� $this->email = $this->input->post('email');�� $this->db->insert('users', $this);�}
<?php�$stmt = $dbh->prepare("INSERT INTO users ( name, age, email ) values ( :name, :age, :email )");�$stmt->bindParam(':name', $name, PDO::PARAM_STR);�$stmt->bindParam(':age', $age, PDO::PARAM_INT);�$stmt->bindParam(':email', $email, PDO::PARAM_STR);�$name = $_POST['name'];�$age = $_POST['age'];�$email = $_POST['email'];�$stmt->execute();
Model - Edit user
<?php�public function update()�{� $this->name = $this->input->post('name'); // similar to $_POST['name']; � $this->age = $this->input->post('age');� $this->email = $this->input->post('email');�� $this->db->update('users', $this, array('id' => $this->input->post('id')));�}
<?php�$stmt = $dbh->prepare("UPDATE users SET name = :name, age = :age, email = :email WHERE id = :id");�$stmt->bindParam(':name', $name, PDO::PARAM_STR);�$stmt->bindParam(':age', $age, PDO::PARAM_INT);�$stmt->bindParam(':email', $email, PDO::PARAM_STR);�$stmt->bindParam(':id', $id, PDO::PARAM_INT);�$name = $_POST['name'];�$age = $_POST['age'];�$email = $_POST['email'];�$id = $_POST['id'];�$stmt->execute();
Model - Delete user
<?php�public function delete($id = FALSE)�{ � $this->db->delete('users', array('id' => $id));�}
<?php�$stmt = $dbh->prepare("DELETE FROM users WHERE id = :id LIMIT 1");�$stmt->bindParam(':id', $id, PDO::PARAM_STR);��$id = $_GET['delete'];�$stmt->execute();
Model
Topics
http://www.makemark.co.uk/wp-content/uploads/2011/05/infooverload_full.jpg
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
3 View files
application/views/*
Views - listing
<?php�foreach ($users as $user) {� ?>� <tr>� <td><?php echo $user->id; ?></td>� <td><?php echo $user->name; ?></td>� <td><?php echo $user->age; ?></td>� <td><?php echo $user->email; ?></td>� <td>� ...
<?php�// Get all users�$stmt = $dbh->prepare("SELECT * FROM users");�$stmt->setFetchMode(PDO::FETCH_ASSOC);�if ($stmt->execute()) {� while ($row = $stmt->fetch()) {� ?>� <tr>� <td><?php echo $row['id']; ?></td>� <td><?php echo $row['name']; ?></td>� <td><?php echo $row['age']; ?></td>� <td><?php echo $row['email']; ?></td>� <td>
...
View
Topics
Model
View
Controller
User
Uses
Manipulate
Updates
Sees
Controller
A Controller is simply a class file that is named in a way that can be associated with a URI.
Relation with url
http://example.com/index.php/CLASS/METHOD/PARAM
http://masterphp.local/mvc/index.php/users/edit/2
<?php�class Users extends CI_Controller {� public function edit($id=FALSE)� {� if (isset($_POST['btnEdit'])) {� $this->m_users->update();� redirect('users');� }� � $this->view_data['user'] = $this->m_users->get_user($id);� $this->load->view('v_edit_user', $this->view_data);� }
Relation with url
http://example.com/index.php/CLASS/METHOD/PARAM
http://masterphp.local/mvc/index.php/users/edit/2
<?php�class Users extends CI_Controller {� public function edit($id=FALSE)� {� if (isset($_POST['btnEdit'])) {� $this->m_users->update();� redirect('users');� }� � $this->view_data['user'] = $this->m_users->get_user($id);� $this->load->view('v_edit_user', $this->view_data);� }
Relation with url
http://example.com/index.php/CLASS/METHOD/PARAM
http://masterphp.local/mvc/index.php/users/edit/2
<?php�class Users extends CI_Controller {� public function edit($id=FALSE)� {� if (isset($_POST['btnEdit'])) {� $this->m_users->update();� redirect('users');� }� � $this->view_data['user'] = $this->m_users->get_user($id);� $this->load->view('v_edit_user', $this->view_data);� }
Relation with url
http://example.com/index.php/CLASS/METHOD/PARAM1/PARAM2
http://masterphp.local/mvc/index.php/users/edit/2/3
<?php�class Users extends CI_Controller {� public function edit($id=FALSE, $param = ‘’)� {� if (isset($_POST['btnEdit'])) {� $this->m_users->update();� redirect('users');� }� � $this->view_data['user'] = $this->m_users->get_user($id);� $this->load->view('v_edit_user', $this->view_data);� }
application/controllers/*
Controller
Topics
pretty url
http://masterphp.local/mvc/index.php/users/edit/2
http://masterphp.local/mvc/users/edit/2
/applications
/index.php
/.htaccess
RewriteEngine On�RewriteCond %{REQUEST_FILENAME} !-f�RewriteCond %{REQUEST_FILENAME} !-d�RewriteRule ^(.*)$ index.php/$1 [L]
pretty url
http://masterphp.local/mvc/index.php/users/edit/2
http://masterphp.local/mvc/users/edit/2
2. edit config file and delete index.php
applications/config/config.php
<?php�$config['index_page'] = 'index.php';��become�$config['index_page'] = '';
Continue your journey
http://suttonschoolswork.co.uk/wp-content/uploads/2014/10/questionmark.jpg
Thank You
Slide
repo
https://github.com/hanafiah/masterphp
https://www.facebook.com/hanafiah.yahya
hanafiah@kreydle.com