Introduction to Using PHP & MVC Frameworks

Post on 10-Jan-2017

995 views 4 download

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/

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

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

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

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/*

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'] = '';

http://suttonschoolswork.co.uk/wp-content/uploads/2014/10/questionmark.jpg

Thank YouSlidehttps://goo.gl/dzfn0Drepohttps://github.com/hanafiah/masterphp

https://www.facebook.com/hanafiah.yahyahanafiah@kreydle.com