• 短小精悍的 PHP MVC架构之URL分发(1)


    接上篇 单点入口 。

    有个现实的比喻很符合这个MVC模式,那时候应该还用纸写信,大家把信件投递到邮筒,邮递员将信件全部收集起来,然后再根据他们的收件地址进行分发

    如果邮资不够或地址不明确则退回邮件,还有些可能会因为各种原因丢失,比如被人偷了,邮递员不小心寄错了,等等,但是其他的都会到达最后的目的地

    收到信的感觉还是很美妙的。程序设计的思想,我想大都来于现实,来于人们长久积累的经验和智慧;但是高于这些,因为它们是对现实的抽象,在抽象的表象下隐藏了

    很多的复杂。 OK,先看框架的目录。

    -------------------------------------------华丽的分割线------------------------------------------------------------

    MVC架构的文件目录

    public/

    -------js/

    -------css/

    -------img/

    index.php

    .htaccess

    app/

    -------controller/

    -------model/

    -------view/

    library/

    bootstrap.php, controller.class.php, model.class.php, template.class.php, mysql.class.php, arist.php

    // 启动文件, 核心的基类文件,数据库类

    config/

    config.php // 配置文件

    tmp/

    .htaccess

    -------------------------------------------华丽的分割线------------------------------------------------------------

    public/index.php 是我们的单入口文件 所有请求都转移到这里分发给不同的控制器,其他都是资源文件;

    app/ 是我们的 MVC架构

    library/ 是我们的 主要类文件和 一些核心文件

    config/ 存放配置文件

    tmp/ 存放临时文件 包括log session upload

    -------------------------------------------华丽的分割线------------------------------------------------------------

    url 分发 (邮件的收集与分发)

    index.php

    <?php    
    //定义框架路径
    define('DS', DIRECTORY_SEPARATOR);
    define('SYSTEM', dirname(dirname(__FILE__)));
    //获得url参数
    $url = isset($_GET['url']) ? $_GET['url']: '';
    //加载启动文件
    require_once (SYSTEM . DS . 'library' . DS . 'bootstrap.php');

    收集了这些url (信件)后, 我们就需要对他们进行处理.

    钩子函数

    View Code
    function Hook() {
        global $url;
        // 定义url 的数组
        $urlArr = array();
      // 分割url 得到url的数组
        $urlArr = explode("/",$url);
        
        if(!empty($urlArr)){
            $controller = array_shift($urlArr); // 得到控制器
            $action = array_shift($urlArr);     // 得到指令
            $stringParameter = $urlArr;         // 得到指令参数
    
            $controllerName = $controller;      // 得到控制器的名称
            $controller = ucwords($controller).'Controller';
            $model = trim($controller);          // 加载Model
            
                    // 初始化控制器
                    $dispatch = new $controller($model,$controllerName,$action);
            
            // 判断控制器方法是否存在
            if ((int)method_exists($controller, $action)) {
                    // 调用控制器的方法,将参数传递进去
                call_user_func_array(array($dispatch,$action),$stringParameter);
            } else {
                //不存在该方法的处理
            }
        }else{
            // 显示首页
            
        }
    }

    这里有一个关键函数 call_user_func_array(array($dispatch, $action), $stringParameter) 

    这个函数会调用 $dispatch对象 的 $action 方法,同时以$stringParameter 作为传入参数。简单表达就是 $dispatch->$action($stringParameter);

    -------------------------------------------华丽的分割线------------------------------------------------------------

    libraray/controller.class.php

     这个是我们的核心基类,还是基本阶段,没有扩展很多方法;

    <?php
    class controller{
        
        protected $_model;
        protected $_controller;  // 用于后面加载相应的模板
        protected $_action;
        protected $_template;
    
      // 初始化控制器 加载DB类 控制器和方法
    function __construct($model, $controller, $action) { $this->_controller = $controller; $this->_action = $action; $this->_model = $model; $this->$model = new $model; $this->_template = new Template($controller, $action); } // 简单的模板功能 function set($name,$value) { $this->_template->set($name,$value); } function __destruct() { $this->_template->render(); }
      // 加载多个 model 对象
    function load($modelArray=''){ if(empty($modelArray)){ return false; }else if(is_array($modelArray)){ foreach($modelArray as $model){ $this->$model = new $model; } }else{ $this->$modelArray = new $modelArray; } } }

    -------------------------------------------华丽的分割线------------------------------------------------------------

    启动文件中有一个 __autoload() 的魔术方法 加载了 所有 library/  和 app/  里的类。 所以只需要  $object = new Class();  就能创建对象。

    所有 MVC框架里的 controller 都会继承这个类 以及它的方法;比如当 url 为 http://yoursite.com/mail/send/132921

    首先会 分发这个 url,  即 controller = "mail", action = "send", stringParameter =['132921'];

    然后初始化这个控制器  $dispatch = new MailController($DB, "mail", '132921');

    然后判断这个对象是否具有该方法 method_exists("MailController", "send");

    最后回调这个方法  call_user_func_array(array($dispatch,'send'),array('132921'));

    class MailController extends Controller{

      function send($id){
        do something...

      }

    }


    这个 $dispatch 是类 MailController 的一个对象,继承自 Controller,拥有操作数据库的基本对象 $DB, 同时可加载其他的 model;

    -------------------------------------------华丽的分割线------------------------------------------------------------


    小结:就象邮递员那样,收集了所有的信件,再进行大致分类;下一步,我们要把信发送出去。 下一篇: 短小精悍的 PHP MVC架构之 render Template(2)

     

     

     

     

     

     

     

  • 相关阅读:
    java 锁
    mybatis 基本用法
    MYSQL 数据库
    进程与线程的区别
    EJB类型
    线程创建方式
    JDBC连接数据库的基本步骤
    org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch
    Centos中的/etc/sysconfig/network-scripts/ifcfg-eth0的正确配置
    利用maven导入依赖失败的问题
  • 原文地址:https://www.cnblogs.com/arist/p/2510904.html
Copyright © 2020-2023  润新知