PHP DevCenter

oreilly.comSafari Books Online.Conferences.

We've expanded our LAMP news coverage and improved our search! Search for all things LAMP across O'Reilly!

Search
Search Tips

advertisement

Print Subscribe to PHP Subscribe to Newsletters

Implementing MVC in PHP: The Model

by Joe Stump
03/02/2006

This article series (starting with Understanding MVC in PHP and continued in Implementing MVC in PHP: The Controller and Implementing MVC in PHP: The View) demonstrates how to build an MVC web framework using PHP 5. This article explains the Model part of Model-View-Controller design.

The Model is where the majority of the application's logic sits. It is where you run queries against the database and perform calculations on input. A good example of what a Model would look like is a simple login script. The login script gets user input from a form, validates it against the database, and then logs in the user.

The first application using the newly created framework will be the users module. I will be creating three Models:

  • login.php validates input from a form against the database
  • logout.php logs a user out and destroys the associated session
  • whoami.php displays simple user information, similar to the Unix program of the same name

Because I am introducing the idea of sessions and users into the framework, I will need to create a few more foundation classes as well as a table in a database. Before I go over the code of login.php, I'd like to walk through these classes.

FR_Session

FR_Session is a wrapper for the built-in PHP sessions. The code isn't very involved and provides only basic support for starting, destroying, and writing sessions.

<?php

  /**
  * FR_Session
  *
  * @author Joe Stump <joe@joestump.net>
  * @copyright Joe Stump <joe@joestump.net>
  * @license http://www.opensource.org/licenses/gpl-license.php
  * @package Framework
  * @filesource
  */

  /**
  * FR_Session
  *
  * Our base session class as a singleton. Handles creating the session, 
  * writing to the session variable (via overloading) and destroying the
  * session.
  *
  * @author Joe Stump <joe@joestump.net>
  * @package Framework
  */
  class FR_Session 
  {
      /**
      * $instance
      *
      * Instance variable used for singleton pattern. Stores a single instance
      * of FR_Session.
      *
      * @author Joe Stump <joe@joestump.net>
      * @var mixed $instance
      */
      private static $instance;

      /**
      * $sessionID
      *
      * The session ID assigned by PHP (usually a 32 character alpha-numeric
      * string).
      *
      * @author Joe Stump <joe@joestump.net>
      * @var string $sessionID
      */
      public static $sessionID;

      // {{{ __construct()
      /**
      * __construct
      *
      * Starts the session and sets the sessionID for the class.
      *
      * @author Joe Stump <joe@joestump.net>
      */
      private function __construct()
      {
          session_start();
          self::$sessionID = session_id();
      }
      // }}}
      // {{{ singleton()
      /**
      * singleton
      * 
      * Implementation of the singleton pattern. Returns a sincle instance
      * of the session class.
      * 
      * @author Joe Stump <joe@joestump.net>
      * @return mixed Instance of session
      */
      public static function singleton()
      {
          if (!isset(self::$instance)) {
              $className = __CLASS__;
              self::$instance = new $className;
          }

          return self::$instance;
      }
      // }}}
      // {{{ destroy()
      public function destroy()
      {
          foreach ($_SESSION as $var => $val) {
              $_SESSION[$var] = null;
          }

          session_destroy();
      }
      // }}}
      // {{{ __clone()
      /**
      * __clone
      *
      * Disable PHP5's cloning method for session so people can't make copies
      * of the session instance.
      * 
      * @author Joe Stump <joe@joestump.net>
      */
      public function __clone()
      {
          trigger_error('Clone is not allowed for '.__CLASS__,E_USER_ERROR);
      }
      // }}}
      // {{{ __get($var)
      /**
      * __get($var)
      *
      * Returns the requested session variable.
      *
      * @author Joe Stump <joe@joestump.net>
      * @return mixed
      * @see FR_Session::__get()
      */
      public function __get($var)
      {
          return $_SESSION[$var];
      }
      // }}}
      // {{{ __set($var,$val)
      /**
      * __set 
      * 
      * Using PHP5's overloading for setting and getting variables we can
      * use $session->var = $val and have it stored in the $_SESSION 
      * variable. To set an email address, for instance you would do the
      * following:
      *
      * <code>
      * $session->email = 'user@example.com';
      * </code>
      *
      * This doesn't actually store 'user@example.com' into $session->email,
      * rather it is stored in $_SESSION['email'].
      * 
      * @author Joe Stump <joe@joestump.net>
      * @param string $var
      * @param mixed $val
      * @see FR_Session::__get()
      * @link http://us3.php.net/manual/en/language.oop5.overloading.php
      */
      public function __set($var,$val)
      {
          return ($_SESSION[$var] = $val);
      }
      // }}}
      // {{{ __destruct()
      /**
      * __destruct()
      *
      * Writes the current session.
      *
      * @author Joe Stump <joe@joestump.net> 
      */
      public function __destruct()
      {
          session_write_close();
      }
      // }}}
  }

?>

Pages: 1, 2, 3, 4

Next Pagearrow




Recommended for You

Tagged Articles

Be the first to post this article to del.icio.us

Sponsored Resources

  • Inside Lightroom
Advertisement

Sponsored by:

Sign up today to receive special discounts,
product alerts, and news from O'Reilly.
Privacy Policy >
View Sample Newsletter >
  • Youtube
  • http://www.youtube.com/OreillyMedia
  • Twitter
  • Subscribe
  • View All RSS Feeds >
O'Reilly Media

800-889-8969 or 707-827-7019
Monday-Friday 7:30am-5pm PT
©2011, O'Reilly Media, Inc.
All trademarks and registered trademarks appearing on oreilly.com are the property of their respective owners.
  • About O'Reilly
  • Academic Solutions
  • Contacts
  • Customer Service
  • Careers
  • Press Room
  • Privacy Policy
  • Terms of Service
  • Writing for O'Reilly
  • Community
  • Authors
  • Forums
  • Membership
  • Newsletters
  • RSS Feeds
  • User Groups
  • Partner Sites
  • makezine.com
  • makerfaire.com
  • craftzine.com
  • igniteshow.com
  • PayPal Developer Zone
  • O'Reilly Insights on Forbes.com