From Spaghetti to MVC Hanafiah Yahya
Who is Hanafiah Yahya? ● Muhamad Hanafiah Bin Yahya ● Digital Immigrants generations ● Started programming, 1997 - MIRC script, VBA, Pascal, ● https://my.linkedin.com/in/hanafiahyahya
Our Awesome Programs
http://www.kreydle.com/academy/
Kreydle Academy ● CSR - Corporate social responsibility ● Non profit initiative… ● We contribute back to community ● Helping Graduates Gain the competitive edge ● fill in the gap between university and what industry really want ● Its free for student
Kreydle Academy ● Want to contribute? ● Help us spread the word. share with your friends on twitter, facebook, blog and any medium that you have ● or Join us as guest speaker http://www.kreydle.com/academy/
http://www.kreydle.com/internship/
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
Survey 1. Home many students/fresh graduate here? 2. Code in PHP? 3. Used MVC?
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
http://www.venicecafechicago.com/wp-content/uploads/2014/07/venicea01.jpg Spaghetti
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 http://masterphp.local/spaghetti/ https://github. com/hanafiah/masterphp/tree/master/spaghetti
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
History Invented in 1979 by Smalltalk programmers, Trygve Reenskaug It is software design pattern http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html
History 1979?.. so old Made popular by Ruby On Rails initial release on 2005 and adapted by PHP community https://upload.wikimedia.org/...n_Rails.svg.png
Why MVC? ● Organized & structured ● Separation of code ● loose coupling ● Easy code maintenance ● Reusable code. DRY - Don’t Repeat Yourself
Model View Controller User Uses ManipulateUpdates Sees
Model View Controller User Uses ManipulateUpdates Sees - Represent Knowledge - Manages data, logic and rules of the application. - Business Logic
Model View Controller User Uses ManipulateUpdates Sees - The output, whats user see. - Visual represent of the Model - Presentation layer
Model View Controller User Uses ManipulateUpdates Sees the middleman / link between user and the system
Model View Controller User Uses ManipulateUpdates Sees The flow
Model View Controller User Uses ManipulateUpdates Sees
Model View Controller User Uses ManipulateUpdates Sees
Model View Controller User Uses ManipulateUpdates Sees
Model View Controller User Uses ManipulateUpdates Sees
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
http://www.makemark.co.uk/wp-content/uploads/2011/05/infooverload_full.jpg
PHP MVC Frameworks 1. CodeIgniter 2. Laravel 3. Symfony 4. CakePHP 5. FuelPHP 6. YII 7. … more
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
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! ● easy to understand ● simple, doesn't require advance OOP ● quick to get up and running ● good docs
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. CodeIgniter http://www.codeigniter.com
Model View Controller User Uses ManipulateUpdates Sees
Model View Controller User Uses ManipulateUpdates Sees
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
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 ); http://www.codeigniter.com/user_guide/database/configuration.html <?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 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
Model View Controller User Uses ManipulateUpdates Sees http://www.codeigniter.com/user_guide/general/models.html
Models application/models/m_users.php
<?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 - Get all users
<?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 - Add new 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 - Edit 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 - Delete user
Model github repo https://github. com/hanafiah/masterphp/blob/master/mvc/application/mod els/m_users.php https://github. com/hanafiah/masterphp/tree/master/spaghetti
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
http://www.makemark.co.uk/wp-content/uploads/2011/05/infooverload_full.jpg
Model View Controller User Uses ManipulateUpdates Sees http://www.codeigniter.com/user_guide/general/views.html
3 View files application/views/*
<?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> ... Views - listing
View github repo https://github. com/hanafiah/masterphp/tree/master/mvc/application/views https://github. com/hanafiah/masterphp/tree/master/spaghetti
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
Model View Controller User Uses ManipulateUpdates Sees http://www.codeigniter.com/user_guide/general/controllers.html
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 git repo https://github. com/hanafiah/masterphp/blob/master/mvc/application/contr ollers/users.php
Topics 1. Spaghetti Code 2. MVC introduction 3. PHP MVC frameworks 4. Working with CodeIgniter 5. Config 6. Model 7. View 8. Controller 9. Continue your journey
pretty url http://masterphp.local/mvc/index.php/users/edit/2 http://masterphp.local/mvc/users/edit/2 1. add .htaccess to root directory /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 1. Library - the classes 2. Helpers - set of functions eg: url, { base_url(), site_url(), anchor() } 3. Database Classes & Helper 4. Custom URL Routing 5. more..
http://suttonschoolswork.co.uk/wp-content/uploads/2014/10/questionmark.jpg
https://www.facebook.com/kreydle
Thank You Slide https://goo.gl/dzfn0D repo https://github.com/hanafiah/masterphp https://www.facebook.com/hanafiah.yahya hanafiah@kreydle.com

Introduction to Using PHP & MVC Frameworks