手把手编写PHP框架 深入了解MVC运行流程

2019-05-03 01:54:11王振洲

以上文件都其实可以直接在 index.php 文件中包含,常量也可以直接在 index.php 中定义,我们这么做的原因是为了在后期管理和拓展中更加的方便,所以把需要在一开始的时候就加载运行的程序统一放到一个单独的文件中引用。

先来看看config文件下的 config .php 文件,该文件的主要作用是设置一些程序的配置项及数据库连接等,主要内容为: 

 <?php
 
/** 变量配置 **/
 
define('DB_NAME', 'todo');
define('DB_USER', 'root');
define('DB_PASSWORD', 'root');
define('DB_HOST', 'localhost');

应该说 config.php 涉及到的内容并不多,不过是一些基础数据库的设置,再来看看 fastphp下的共用框架入口文件 Core.php 应该怎么写。
 

<?php
/**
 * FastPHP核心框架
 */
class Core
{
  // 运行程序
  function run()
  {
    spl_autoload_register(array($this, 'loadClass'));
    $this->setReporting();
    $this->removeMagicQuotes();
    $this->unregisterGlobals();
    $this->Route();
  }

  // 路由处理
  function Route()
  {
    $controllerName = 'Index';
    $action = 'index';

    if (!empty($_GET['url'])) {
      $url = $_GET['url'];
      $urlArray = explode('/', $url);
      
      // 获取控制器名
      $controllerName = ucfirst($urlArray[0]);
      
      // 获取动作名
      array_shift($urlArray);
      $action = empty($urlArray[0]) ? 'index' : $urlArray[0];
      
      //获取URL参数
      array_shift($urlArray);
      $queryString = empty($urlArray) ? array() : $urlArray;
    }

    // 数据为空的处理
    $queryString = empty($queryString) ? array() : $queryString;

    // 实例化控制器
    $controller = $controllerName . 'Controller';
    $dispatch = new $controller($controllerName, $action);

    // 如果控制器存和动作存在,这调用并传入URL参数
    if ((int)method_exists($controller, $action)) {
      call_user_func_array(array($dispatch, $action), $queryString);
    } else {
      exit($controller . "控制器不存在");
    }
  }

  // 检测开发环境
  function setReporting()
  {
    if (APP_DEBUG === true) {
      error_reporting(E_ALL);
      ini_set('display_errors','On');
    } else {
      error_reporting(E_ALL);
      ini_set('display_errors','Off');
      ini_set('log_errors', 'On');
      ini_set('error_log', RUNTIME_PATH. 'logs/error.log');
    }
  }

  // 删除敏感字符
  function stripSlashesDeep($value)
  {
    $value = is_array($value) ? array_map('stripSlashesDeep', $value) : stripslashes($value);
    return $value;
  }

  // 检测敏感字符并删除
  function removeMagicQuotes()
  {
    if ( get_magic_quotes_gpc()) {
      $_GET = stripSlashesDeep($_GET );
      $_POST = stripSlashesDeep($_POST );
      $_COOKIE = stripSlashesDeep($_COOKIE);
      $_SESSION = stripSlashesDeep($_SESSION);
    }
  }

  // 检测自定义全局变量(register globals)并移除
  function unregisterGlobals()
  {
    if (ini_get('register_globals')) {
      $array = array('_SESSION', '_POST', '_GET', '_COOKIE', '_REQUEST', '_SERVER', '_ENV', '_FILES');
      foreach ($array as $value) {
        foreach ($GLOBALS[$value] as $key => $var) {
          if ($var === $GLOBALS[$key]) {
            unset($GLOBALS[$key]);
          }
        }
      }
    }
  }

  // 自动加载控制器和模型类 
  static function loadClass($class)
  {
    $frameworks = FRAME_PATH . $class . '.class.php';
    $controllers = APP_PATH . 'application/controllers/' . $class . '.class.php';
    $models = APP_PATH . 'application/models/' . $class . '.class.php';

    if (file_exists($frameworks)) {
      // 加载框架核心类
      include $frameworks;
    } elseif (file_exists($controllers)) {
      // 加载应用控制器类
      include $controllers;
    } elseif (file_exists($models)) {
      //加载应用模型类
      include $models;
    } else {
      /* 错误代码 */
    }
  }
}

								 
			 
相关文章 大家在看