introduction to using php & mvc frameworks
TRANSCRIPT
From Spaghetti to MVCHanafiah 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
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/
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. Continue your journey
Survey
1. Home many students/fresh graduate here?2. Code in PHP?3. Used MVC?
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. 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 Code1) 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
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. 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 Railsinitial 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
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. Continue your journey
http://www.makemark.co.uk/wp-content/uploads/2011/05/infooverload_full.jpg
PHP MVC Frameworks
1. CodeIgniter 2. Laravel3. Symfony4. CakePHP5. FuelPHP6. YII7. … more
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. 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
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. 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
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. 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
Modelgithub repo
https://github.com/hanafiah/masterphp/blob/master/mvc/application/models/m_users.php
https://github.com/hanafiah/masterphp/tree/master/spaghetti
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. 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
Viewgithub repo
https://github.com/hanafiah/masterphp/tree/master/mvc/application/views
https://github.com/hanafiah/masterphp/tree/master/spaghetti
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. 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 urlhttp://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 urlhttp://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 urlhttp://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 urlhttp://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/*
Controllergit repo
https://github.com/hanafiah/masterphp/blob/master/mvc/application/controllers/users.php
Topics1. Spaghetti Code2. MVC introduction3. PHP MVC frameworks4. Working with CodeIgniter5. Config6. Model7. View8. Controller9. Continue your journey
pretty urlhttp://masterphp.local/mvc/index.php/users/edit/2http://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 urlhttp://masterphp.local/mvc/index.php/users/edit/2http://masterphp.local/mvc/users/edit/2
2. edit config file and delete index.phpapplications/config/config.php
<?php
$config['index_page'] = 'index.php';
become
$config['index_page'] = '';
Continue your journey
1. Library - the classes2. Helpers - set of functions eg: url, {
base_url(), site_url(), anchor() } 3. Database Classes & Helper4. Custom URL Routing 5. more..
http://suttonschoolswork.co.uk/wp-content/uploads/2014/10/questionmark.jpg
Thank YouSlidehttps://goo.gl/dzfn0Drepohttps://github.com/hanafiah/masterphp
https://www.facebook.com/[email protected]