SlideShare une entreprise Scribd logo
1  sur  22
PHPBelgium event 2009-06-24




              PHP & the MVC Pattern


http://joind.in/609                       Patrick Allaert


        PHPBelgium – Belgian PHP community
                         http://www.phpbelgium.be/
About Me
Started developping using PHP 3
Ten years of FOSS evangelism
Contribute to different FOSS:
    Tabellio (Open Source Collaboration for assemblies)
    Xoo°f (eXtensible Open Object Oriented Framework)
    KDESvn (Subversion frontend for KDE)
    PHP (ext/ldap)
APM lead developer (Alternative PHP Monitor)
Working @ AUSY
PHPBelgium staff member
Blog: http://patrickallaert.blogspot.com/
Twitter: http://twitter.com/patrick_allaert
               PHPBelgium – Belgian PHP community
                                              http://www.phpbelgium.be/
Model-View-Controller (1)
“… is an architectural pattern used in software
 engineering. Successful use of the pattern
 isolates business logic from user interface
 considerations, resulting in an application
 where it is easier to modify either the visual
 appearance of the application or the underlying
 business rules without affecting the other.”
                                                 Wikipedia


        PHPBelgium – Belgian PHP community
                         http://www.phpbelgium.be/
Model-View-Controller (2)


                                           Model
                                                          DB


Requests       Controller


                                                         (X)HTML
                                           View            XML




            PHPBelgium – Belgian PHP community
                             http://www.phpbelgium.be/
Design of some PHP applications




    PHPBelgium – Belgian PHP community
                     http://www.phpbelgium.be/
Managing this is sometimes...




           very difficult...
   PHPBelgium – Belgian PHP community
                    http://www.phpbelgium.be/
Demo application




/index.php                  /team.php?id=<TeamID>

 PHPBelgium – Belgian PHP community
                  http://www.phpbelgium.be/
Spaghetti code
<?php                                                       <table id="ranking">
$db = new mysqli("localhost", "foot", "footpw", "foot");      <tr>

$result = $db->query(
                                                                <th>Name</th>Presentation
                                                                <th>Points</th>
  "SELECT name, won, lost, draw, coach,                       </tr>
                Business Logic
     won * 3 + draw AS points                               <?php
   FROM team
   WHERE id = " . (int) $_GET['id']);                                     Business Logic
                                                            $result = $db->query("SELECT * FROM ranking");
                                                            while ($row = $result->fetch_assoc()) {
$team = $result->fetch_assoc();                             ?>
?>                                                            <tr>
<html>                                                          <td class="name">
<head>                                                            <a href="team.php?id=<?= $row['id'] ?>">
  <title>Team - <?= $team['name'] ?></title>                        <?= $row['name'] ?>
</head>                                                           </a>
<body id="team">                                                </td>
<h1>Team: <?= $team['name'] ?></h1>                             <td class="points">
<table id="info">                                                 <?= $row['points'] ?>
                  Presentation
  <tr><th>Won:</th>   <td><?= $team['won'] ?></td></tr>         </td>        Presentation
  <tr><th>Lost:</th>  <td><?= $team['lost'] ?></td></tr>      </tr>
  <tr><th>Draw:</th>  <td><?= $team['draw'] ?></td></tr>    <?php
  <tr><th>Points:</th><td><?= $team['points'] ?             }
></td></tr>                                                 ?>
  <tr><th>Coach:</th> <td><?= $team['coach'] ?></td></tr>   </table>
</table>                                                    <a href="/">Ranking</a>
                                                            </body>
                                                            </html>




                       PHPBelgium – Belgian PHP community
                                                            http://www.phpbelgium.be/
Taking the Business Logic apart (1)




      PHPBelgium – Belgian PHP community
                       http://www.phpbelgium.be/
Taking the Business Logic apart (2)
             class Team {
               public static function getInformationById($id) {
                 return Database::getInstance()
                   ->query(
                   "SELECT name, won, lost, draw, coach, won*3+draw AS points " .
                   "FROM team WHERE id = " . (int) $id)
                   ->fetch_assoc();
               }
             }

             class Ranking {
               public static function generate() {
                 return Database::getInstance()
                   ->query("SELECT * FROM ranking")
                   ->fetch_all();
               }
             }

             class Database {
               public static function getInstance() {
                 static $connection = null;

                 if ($connection === null) {
                   $connection = new mysqli("localhost", "foot", "footpw", "foot");
                 }

                 return $connection;
               }
             }



      PHPBelgium – Belgian PHP community
                               http://www.phpbelgium.be/
Taking the Business Logic apart (3)
 $position = 1;
 foreach (Ranking::generate() as $team) {
 ?>
     <tr>
         <td class="position"><?= $position++ ?></td>
         <td class="name"><a href="team.php?id=<?= $team['id'] ?>"><?= $team['name'] ?></a></td>
         <td class="played"><?= $team['played'] ?></td>
         <td class="won"><?= $team['won'] ?></td>
         <td class="lost"><?= $team['lost'] ?></td>
         <td class="draw"><?= $team['draw'] ?></td>
         <td class="points"><?= $team['points'] ?></td>
     </tr>
 <?php
 }

 <?php
 require 'Team.php';
 require 'Ranking.php';
 $team = Team::getInformationById($_GET['id']);
 ?>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

 foreach (Ranking::generate() as $row) {
 ?>
     <tr<?php if ($row['id'] === $_GET['id']) { ?> class="selected"<?php } ?>>
         <td class="name"><a href="team.php?id=<?= $row['id'] ?>"><?= $row['name'] ?></a></td>
         <td class="points"><?= $row['points'] ?></td>
     </tr>
 <?php
 }




              PHPBelgium – Belgian PHP community
                                                  http://www.phpbelgium.be/
Evaluating the situation
Model is reusable         Views tightly linked to
Changes to the              the model
 business logic does      Views impacted if the
 not require inspecting     API of the model
 all files                  change
                          Calls to the model may
                           be difficult to find:
                           spread everywhere in
                           views

        PHPBelgium – Belgian PHP community
                          http://www.phpbelgium.be/
On the path to MVC (1)
                                             <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
                                             <html>
                                             <head>
                                               <title>Team - <?= $GLOBALS['team']['name'] ?></title>
                                             </head>
                                             <body id="team">
                                             <h1>Team: <?= $GLOBALS['team']['name'] ?></h1>
                                             <table id="info">
                                               <tr><th>Won:</th>   <td><?= $GLOBALS['team']['won'] ?></td></tr>
                                               <tr><th>Lost:</th>  <td><?= $GLOBALS['team']['lost'] ?></td></tr>
                                               <tr><th>Draw:</th>  <td><?= $GLOBALS['team']['draw'] ?></td></tr>
                                               <tr><th>Points:</th><td><?= $GLOBALS['team']['points'] ?></td></tr>
                                               <tr><th>Coach:</th> <td><?= $GLOBALS['team']['coach'] ?></td></tr>
                                             </table>
                                             <table id="ranking">
                                               <tr>
         <?php
                                                 <th>Name</th><th>Points</th>
         require 'Ranking.php';
                                               </tr>
                                             <?php
         // View variables
                                             foreach ($GLOBALS['ranking'] as $row) {
         $ranking = Ranking::generate();
                                             ?>
                                               <tr>
         require 'home.tpl';
                                                 <td class="name">
                                                   <a href="team.php?id=<?= $row['id'] ?>"><?= $row['name'] ?></a>
<?php                                            </td>
require 'Team.php';                              <td class="points"><?= $row['points'] ?></td>
require 'Ranking.php';                         </tr>
                                             <?php
// View variables                            }
$teamId = $_GET['id'];                       ?>
$team = Team::getInformationById($teamId);   </table>
$ranking = Ranking::generate();              </body>
                                             </html>
require 'team.tpl';




                         PHPBelgium – Belgian PHP community
                                                        http://www.phpbelgium.be/
On the path to MVC (2)
View parameters are passed using global
  variables
  Hint: $variableName may also be written:
  $GLOBALS['variableName']
  The latest form may be used to differentiate
  variables defined by the controller file from the
  local view variables
“htdocs” could be renamed “controllers”


         PHPBelgium – Belgian PHP community
                           http://www.phpbelgium.be/
Howto: Clean URL
Clean URL: Transforming
   http://example.com/index.php?type=article&id=25&date=20020322
   into:
   http://example.com/article/200203226
Enables better search engine indexing
URIs are not supposed to change (Cool URIs don't change)
Doesn't expose the server-side language
Most MVC Frameworks provide clean URL mechanism, how to setup one with
  our structure?




             PHPBelgium – Belgian PHP community
                                        http://www.phpbelgium.be/
Clean URL: method #1
Using Apache's mod_rewrite:
 RewriteEngine On
 RewriteRule ^/team/([0-9]*)$ /team.php?id=$1 [L]

Ability to transform URLs on the fly and mapping
 part of the URL directly to a $_GET variable




        PHPBelgium – Belgian PHP community
                         http://www.phpbelgium.be/
Clean URL: method #2
Dropping the “.php” extension and forcing the
 mime-type/handler used in the Apache
 configuration

<FilesMatch "^(index|team)$">
      ForceType application/x-httpd-php
  </FilesMatch>
 or:
 <FilesMatch "^(index|team)$">
     SetHandler application/x-httpd-php
 </FilesMatch>


        PHPBelgium – Belgian PHP community
                         http://www.phpbelgium.be/
Performance impact (index page)

 Concurrency           1                           15
 “spaghetti”         1776.65                     3545.77
 Model-View          1615.43                     3137.52
 MVC                 1602.57                     3091.74
 Clean URL #1        1554.86                     3032.25
 Clean URL #2        1686.85                     3294.60
 Zend Framework      246.36                      421.15
                               In requests/second, higher = better




         PHPBelgium – Belgian PHP community
                               http://www.phpbelgium.be/
Performance impact (team page)

 Concurrency           1                           15
 “spaghetti”         1778.89                     3507.61
 Model-View          1580.92                     3065.41
 MVC                 1546.32                     3032.64
 Clean URL #1        1519.59                     2986.12
 Clean URL #2        1465.43                     2896.54
 Zend Framework      233.94                      402.54
                               In requests/second, higher = better




         PHPBelgium – Belgian PHP community
                               http://www.phpbelgium.be/
Questions ?




PHPBelgium – Belgian PHP community
                 http://www.phpbelgium.be/
Thanks :-)



These slides will be available through:
  http://patrickallaert.blogspot.com/

     You can vote for this talk on:
          http://joind.in/609



   PHPBelgium – Belgian PHP community
                    http://www.phpbelgium.be/
License
This presentation material is published under the Creative Commons Attribution-Share Alike 3.0 Unported license.

You are free:

to Share — to copy, distribute and transmit the work

to Remix — to adapt the work

Under the following conditions:

Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that
  suggests that they endorse you or your use of the work).

Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the
  same, similar or a compatible license.

With the understanding that:

Waiver — Any of the above conditions can be waived if you get permission from the copyright holder.

Other Rights — In no way are any of the following rights affected by the license:

  Your fair dealing or fair use rights;
  The author's moral rights;
  Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy
    rights.


                         PHPBelgium – Belgian PHP community
                                                             http://www.phpbelgium.be/

Contenu connexe

En vedette

PHP Frameworks and CodeIgniter
PHP Frameworks and CodeIgniterPHP Frameworks and CodeIgniter
PHP Frameworks and CodeIgniterKHALID C
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Phpfunkatron
 
Principles of MVC for PHP Developers
Principles of MVC for PHP DevelopersPrinciples of MVC for PHP Developers
Principles of MVC for PHP DevelopersEdureka!
 
Why to choose laravel framework
Why to choose laravel frameworkWhy to choose laravel framework
Why to choose laravel frameworkBo-Yi Wu
 
How to choose web framework
How to choose web frameworkHow to choose web framework
How to choose web frameworkBo-Yi Wu
 
REST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterREST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterSachin G Kulkarni
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkBo-Yi Wu
 
PHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding stylePHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding styleBo-Yi Wu
 
RESTful API Design & Implementation with CodeIgniter PHP Framework
RESTful API Design & Implementation with CodeIgniter PHP FrameworkRESTful API Design & Implementation with CodeIgniter PHP Framework
RESTful API Design & Implementation with CodeIgniter PHP FrameworkBo-Yi Wu
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golangBo-Yi Wu
 
Class 7 - PHP Object Oriented Programming
Class 7 - PHP Object Oriented ProgrammingClass 7 - PHP Object Oriented Programming
Class 7 - PHP Object Oriented ProgrammingAhmed Swilam
 
Class 5 - PHP Strings
Class 5 - PHP StringsClass 5 - PHP Strings
Class 5 - PHP StringsAhmed Swilam
 
Class 4 - PHP Arrays
Class 4 - PHP ArraysClass 4 - PHP Arrays
Class 4 - PHP ArraysAhmed Swilam
 
Class 8 - Database Programming
Class 8 - Database ProgrammingClass 8 - Database Programming
Class 8 - Database ProgrammingAhmed Swilam
 
Class 3 - PHP Functions
Class 3 - PHP FunctionsClass 3 - PHP Functions
Class 3 - PHP FunctionsAhmed Swilam
 
Class 1 - World Wide Web Introduction
Class 1 - World Wide Web IntroductionClass 1 - World Wide Web Introduction
Class 1 - World Wide Web IntroductionAhmed Swilam
 
Class 2 - Introduction to PHP
Class 2 - Introduction to PHPClass 2 - Introduction to PHP
Class 2 - Introduction to PHPAhmed Swilam
 
Class 6 - PHP Web Programming
Class 6 - PHP Web ProgrammingClass 6 - PHP Web Programming
Class 6 - PHP Web ProgrammingAhmed Swilam
 

En vedette (19)

PHP Frameworks and CodeIgniter
PHP Frameworks and CodeIgniterPHP Frameworks and CodeIgniter
PHP Frameworks and CodeIgniter
 
Intro To Mvc Development In Php
Intro To Mvc Development In PhpIntro To Mvc Development In Php
Intro To Mvc Development In Php
 
Principles of MVC for PHP Developers
Principles of MVC for PHP DevelopersPrinciples of MVC for PHP Developers
Principles of MVC for PHP Developers
 
Why to choose laravel framework
Why to choose laravel frameworkWhy to choose laravel framework
Why to choose laravel framework
 
How to choose web framework
How to choose web frameworkHow to choose web framework
How to choose web framework
 
REST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in CodeigniterREST API Best Practices & Implementing in Codeigniter
REST API Best Practices & Implementing in Codeigniter
 
CodeIgniter PHP MVC Framework
CodeIgniter PHP MVC FrameworkCodeIgniter PHP MVC Framework
CodeIgniter PHP MVC Framework
 
PHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding stylePHP & JavaScript & CSS Coding style
PHP & JavaScript & CSS Coding style
 
PHP MVC
PHP MVCPHP MVC
PHP MVC
 
RESTful API Design & Implementation with CodeIgniter PHP Framework
RESTful API Design & Implementation with CodeIgniter PHP FrameworkRESTful API Design & Implementation with CodeIgniter PHP Framework
RESTful API Design & Implementation with CodeIgniter PHP Framework
 
Write microservice in golang
Write microservice in golangWrite microservice in golang
Write microservice in golang
 
Class 7 - PHP Object Oriented Programming
Class 7 - PHP Object Oriented ProgrammingClass 7 - PHP Object Oriented Programming
Class 7 - PHP Object Oriented Programming
 
Class 5 - PHP Strings
Class 5 - PHP StringsClass 5 - PHP Strings
Class 5 - PHP Strings
 
Class 4 - PHP Arrays
Class 4 - PHP ArraysClass 4 - PHP Arrays
Class 4 - PHP Arrays
 
Class 8 - Database Programming
Class 8 - Database ProgrammingClass 8 - Database Programming
Class 8 - Database Programming
 
Class 3 - PHP Functions
Class 3 - PHP FunctionsClass 3 - PHP Functions
Class 3 - PHP Functions
 
Class 1 - World Wide Web Introduction
Class 1 - World Wide Web IntroductionClass 1 - World Wide Web Introduction
Class 1 - World Wide Web Introduction
 
Class 2 - Introduction to PHP
Class 2 - Introduction to PHPClass 2 - Introduction to PHP
Class 2 - Introduction to PHP
 
Class 6 - PHP Web Programming
Class 6 - PHP Web ProgrammingClass 6 - PHP Web Programming
Class 6 - PHP Web Programming
 

Plus de Patrick Allaert

Advanced debugging techniques (PHP)
Advanced debugging techniques (PHP)Advanced debugging techniques (PHP)
Advanced debugging techniques (PHP)Patrick Allaert
 
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, ItalyPHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, ItalyPatrick Allaert
 
La métrique, ce n'est pas que pour le devops
La métrique, ce n'est pas que pour le devopsLa métrique, ce n'est pas que pour le devops
La métrique, ce n'est pas que pour le devopsPatrick Allaert
 
Maitriser les structures de données PHP 102 - Forum Paris 2012
Maitriser les structures de données PHP 102 - Forum Paris 2012Maitriser les structures de données PHP 102 - Forum Paris 2012
Maitriser les structures de données PHP 102 - Forum Paris 2012Patrick Allaert
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaPatrick Allaert
 
Mastering PHP Data Structure 102 - phpDay 2012 Verona
Mastering PHP Data Structure 102 - phpDay 2012 VeronaMastering PHP Data Structure 102 - phpDay 2012 Verona
Mastering PHP Data Structure 102 - phpDay 2012 VeronaPatrick Allaert
 
Masterizing PHP Data Structure 102 - PHPUK 2012
Masterizing PHP Data Structure 102 - PHPUK 2012Masterizing PHP Data Structure 102 - PHPUK 2012
Masterizing PHP Data Structure 102 - PHPUK 2012Patrick Allaert
 
Masterizing php data structure 102
Masterizing php data structure 102Masterizing php data structure 102
Masterizing php data structure 102Patrick Allaert
 
PHP applications/environments monitoring: APM & Pinba
PHP applications/environments monitoring: APM & PinbaPHP applications/environments monitoring: APM & Pinba
PHP applications/environments monitoring: APM & PinbaPatrick Allaert
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaPatrick Allaert
 
MVC = Make Venerated Code?
MVC = Make Venerated Code?MVC = Make Venerated Code?
MVC = Make Venerated Code?Patrick Allaert
 

Plus de Patrick Allaert (11)

Advanced debugging techniques (PHP)
Advanced debugging techniques (PHP)Advanced debugging techniques (PHP)
Advanced debugging techniques (PHP)
 
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, ItalyPHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
 
La métrique, ce n'est pas que pour le devops
La métrique, ce n'est pas que pour le devopsLa métrique, ce n'est pas que pour le devops
La métrique, ce n'est pas que pour le devops
 
Maitriser les structures de données PHP 102 - Forum Paris 2012
Maitriser les structures de données PHP 102 - Forum Paris 2012Maitriser les structures de données PHP 102 - Forum Paris 2012
Maitriser les structures de données PHP 102 - Forum Paris 2012
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 Verona
 
Mastering PHP Data Structure 102 - phpDay 2012 Verona
Mastering PHP Data Structure 102 - phpDay 2012 VeronaMastering PHP Data Structure 102 - phpDay 2012 Verona
Mastering PHP Data Structure 102 - phpDay 2012 Verona
 
Masterizing PHP Data Structure 102 - PHPUK 2012
Masterizing PHP Data Structure 102 - PHPUK 2012Masterizing PHP Data Structure 102 - PHPUK 2012
Masterizing PHP Data Structure 102 - PHPUK 2012
 
Masterizing php data structure 102
Masterizing php data structure 102Masterizing php data structure 102
Masterizing php data structure 102
 
PHP applications/environments monitoring: APM & Pinba
PHP applications/environments monitoring: APM & PinbaPHP applications/environments monitoring: APM & Pinba
PHP applications/environments monitoring: APM & Pinba
 
Monitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et PinbaMonitoring d'applications/environnements PHP: APM et Pinba
Monitoring d'applications/environnements PHP: APM et Pinba
 
MVC = Make Venerated Code?
MVC = Make Venerated Code?MVC = Make Venerated Code?
MVC = Make Venerated Code?
 

Dernier

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 

Dernier (20)

04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 

PHP & the MVC Pattern

  • 1. PHPBelgium event 2009-06-24 PHP & the MVC Pattern http://joind.in/609 Patrick Allaert PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 2. About Me Started developping using PHP 3 Ten years of FOSS evangelism Contribute to different FOSS: Tabellio (Open Source Collaboration for assemblies) Xoo°f (eXtensible Open Object Oriented Framework) KDESvn (Subversion frontend for KDE) PHP (ext/ldap) APM lead developer (Alternative PHP Monitor) Working @ AUSY PHPBelgium staff member Blog: http://patrickallaert.blogspot.com/ Twitter: http://twitter.com/patrick_allaert PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 3. Model-View-Controller (1) “… is an architectural pattern used in software engineering. Successful use of the pattern isolates business logic from user interface considerations, resulting in an application where it is easier to modify either the visual appearance of the application or the underlying business rules without affecting the other.” Wikipedia PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 4. Model-View-Controller (2) Model DB Requests Controller (X)HTML View XML PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 5. Design of some PHP applications PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 6. Managing this is sometimes... very difficult... PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 7. Demo application /index.php /team.php?id=<TeamID> PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 8. Spaghetti code <?php <table id="ranking"> $db = new mysqli("localhost", "foot", "footpw", "foot");   <tr> $result = $db->query(     <th>Name</th>Presentation     <th>Points</th> "SELECT name, won, lost, draw, coach,   </tr> Business Logic won * 3 + draw AS points <?php FROM team WHERE id = " . (int) $_GET['id']); Business Logic $result = $db->query("SELECT * FROM ranking"); while ($row = $result->fetch_assoc()) { $team = $result->fetch_assoc(); ?> ?>   <tr> <html>     <td class="name"> <head>       <a href="team.php?id=<?= $row['id'] ?>">   <title>Team - <?= $team['name'] ?></title>         <?= $row['name'] ?> </head>       </a> <body id="team">     </td> <h1>Team: <?= $team['name'] ?></h1>     <td class="points"> <table id="info"> <?= $row['points'] ?> Presentation   <tr><th>Won:</th>   <td><?= $team['won'] ?></td></tr> </td> Presentation   <tr><th>Lost:</th>  <td><?= $team['lost'] ?></td></tr>   </tr>   <tr><th>Draw:</th>  <td><?= $team['draw'] ?></td></tr> <?php   <tr><th>Points:</th><td><?= $team['points'] ? } ></td></tr> ?>   <tr><th>Coach:</th> <td><?= $team['coach'] ?></td></tr> </table> </table> <a href="/">Ranking</a> </body> </html> PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 9. Taking the Business Logic apart (1) PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 10. Taking the Business Logic apart (2) class Team {   public static function getInformationById($id) {     return Database::getInstance() ->query(       "SELECT name, won, lost, draw, coach, won*3+draw AS points " .       "FROM team WHERE id = " . (int) $id) ->fetch_assoc();   } } class Ranking {   public static function generate() {     return Database::getInstance() ->query("SELECT * FROM ranking") ->fetch_all();   } } class Database {   public static function getInstance() {     static $connection = null;     if ($connection === null) {       $connection = new mysqli("localhost", "foot", "footpw", "foot");     }     return $connection;   } } PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 11. Taking the Business Logic apart (3) $position = 1; foreach (Ranking::generate() as $team) { ?>     <tr>         <td class="position"><?= $position++ ?></td>         <td class="name"><a href="team.php?id=<?= $team['id'] ?>"><?= $team['name'] ?></a></td>         <td class="played"><?= $team['played'] ?></td>         <td class="won"><?= $team['won'] ?></td>         <td class="lost"><?= $team['lost'] ?></td>         <td class="draw"><?= $team['draw'] ?></td>         <td class="points"><?= $team['points'] ?></td>     </tr> <?php } <?php require 'Team.php'; require 'Ranking.php'; $team = Team::getInformationById($_GET['id']); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> foreach (Ranking::generate() as $row) { ?>     <tr<?php if ($row['id'] === $_GET['id']) { ?> class="selected"<?php } ?>>         <td class="name"><a href="team.php?id=<?= $row['id'] ?>"><?= $row['name'] ?></a></td>         <td class="points"><?= $row['points'] ?></td>     </tr> <?php } PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 12. Evaluating the situation Model is reusable Views tightly linked to Changes to the the model business logic does Views impacted if the not require inspecting API of the model all files change Calls to the model may be difficult to find: spread everywhere in views PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 13. On the path to MVC (1) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head>   <title>Team - <?= $GLOBALS['team']['name'] ?></title> </head> <body id="team"> <h1>Team: <?= $GLOBALS['team']['name'] ?></h1> <table id="info">   <tr><th>Won:</th>   <td><?= $GLOBALS['team']['won'] ?></td></tr>   <tr><th>Lost:</th>  <td><?= $GLOBALS['team']['lost'] ?></td></tr>   <tr><th>Draw:</th>  <td><?= $GLOBALS['team']['draw'] ?></td></tr>   <tr><th>Points:</th><td><?= $GLOBALS['team']['points'] ?></td></tr>   <tr><th>Coach:</th> <td><?= $GLOBALS['team']['coach'] ?></td></tr> </table> <table id="ranking">   <tr> <?php     <th>Name</th><th>Points</th> require 'Ranking.php';   </tr> <?php // View variables foreach ($GLOBALS['ranking'] as $row) { $ranking = Ranking::generate(); ?>   <tr> require 'home.tpl';     <td class="name"> <a href="team.php?id=<?= $row['id'] ?>"><?= $row['name'] ?></a> <?php </td> require 'Team.php';     <td class="points"><?= $row['points'] ?></td> require 'Ranking.php';   </tr> <?php // View variables } $teamId = $_GET['id']; ?> $team = Team::getInformationById($teamId); </table> $ranking = Ranking::generate(); </body> </html> require 'team.tpl'; PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 14. On the path to MVC (2) View parameters are passed using global variables Hint: $variableName may also be written: $GLOBALS['variableName'] The latest form may be used to differentiate variables defined by the controller file from the local view variables “htdocs” could be renamed “controllers” PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 15. Howto: Clean URL Clean URL: Transforming http://example.com/index.php?type=article&id=25&date=20020322 into: http://example.com/article/200203226 Enables better search engine indexing URIs are not supposed to change (Cool URIs don't change) Doesn't expose the server-side language Most MVC Frameworks provide clean URL mechanism, how to setup one with our structure? PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 16. Clean URL: method #1 Using Apache's mod_rewrite: RewriteEngine On RewriteRule ^/team/([0-9]*)$ /team.php?id=$1 [L] Ability to transform URLs on the fly and mapping part of the URL directly to a $_GET variable PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 17. Clean URL: method #2 Dropping the “.php” extension and forcing the mime-type/handler used in the Apache configuration <FilesMatch "^(index|team)$"> ForceType application/x-httpd-php </FilesMatch> or: <FilesMatch "^(index|team)$"> SetHandler application/x-httpd-php </FilesMatch> PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 18. Performance impact (index page) Concurrency 1 15 “spaghetti” 1776.65 3545.77 Model-View 1615.43 3137.52 MVC 1602.57 3091.74 Clean URL #1 1554.86 3032.25 Clean URL #2 1686.85 3294.60 Zend Framework 246.36 421.15 In requests/second, higher = better PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 19. Performance impact (team page) Concurrency 1 15 “spaghetti” 1778.89 3507.61 Model-View 1580.92 3065.41 MVC 1546.32 3032.64 Clean URL #1 1519.59 2986.12 Clean URL #2 1465.43 2896.54 Zend Framework 233.94 402.54 In requests/second, higher = better PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 20. Questions ? PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 21. Thanks :-) These slides will be available through: http://patrickallaert.blogspot.com/ You can vote for this talk on: http://joind.in/609 PHPBelgium – Belgian PHP community http://www.phpbelgium.be/
  • 22. License This presentation material is published under the Creative Commons Attribution-Share Alike 3.0 Unported license. You are free: to Share — to copy, distribute and transmit the work to Remix — to adapt the work Under the following conditions: Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license. With the understanding that: Waiver — Any of the above conditions can be waived if you get permission from the copyright holder. Other Rights — In no way are any of the following rights affected by the license: Your fair dealing or fair use rights; The author's moral rights; Rights other persons may have either in the work itself or in how the work is used, such as publicity or privacy rights. PHPBelgium – Belgian PHP community http://www.phpbelgium.be/