文档章节

创建一个自己的MVC框架

专业填坑
 专业填坑
发布于 2015/09/25 15:27
字数 504
阅读 37
收藏 0

目录结构:

文件:index.php

<?php
use Core\autoLoad;

//类自动加载
include 'Core/autoLoad.php';
autoLoad::run();

//路由解析
$urlManager = new \Core\UrlManager();
$urlManager->parseRuquest();

index.php是整个框架的入口

文件:UrlManager.php

<?php
namespace Core;

class UrlManager{

    public $suffix; //后缀
    public $flag = 'r'; //标志,it do not realize temporarily
    public $controller; //控制器
    public $action; //方法
    public $module; //模块

    public function createUrl(){

    }

    public function parseRuquest(){
        $url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        
        //获取参数
        /**
        if(strpos(rtrim($url,'&'),'&',1)){
            $params = array_filter(explode('&',strchr(trim($url,'&'),'&')),function($arr){
                return !empty($arr);
            });
            //var_dump($params);
        }
        */

        //解析下当前URL
       /**
        * http://object.cm/index.php?r=repositories/default/MyResource&&3f&fg&78
        * 'scheme' => string 'http'
        * 'host' => string 'object.cm'
        * 'path' => string '/index.php'
        * 'query' => string 'r=default/myresource&&resourceType=exam&name%20=%20wuzhc'
        */

        $urlArr = parse_url($url);
        $urlQuery = $urlArr['query'];

        /**
         * 获取控制器 动作 模块
         *  0 => string 'repositories'
         *  1 => string 'default'
         *  2 => string 'MyResource'
         */
        $arr = array_map(function($arr){
            if(preg_match('/^r=/i',$arr))
                return str_replace('r=','',$arr);
            elseif($pos = strpos($arr,'&'))
                return substr($arr,0,$pos);
            else
                return $arr;
        },explode('/',$urlQuery));

        /**
         * 如果有三个,说明是有模块
         * 当前不支持多层模块路径
         */
        $count = count($arr);
        switch($count){
            case 2:
                list($this->controller,$this->action) = $arr;
                break;
            case 3:
                list($this->moudle,$this->controller,$this->action) = $arr;
                break;
            default:
                exit('Sorry , the current framework does not support multiple modules');
                break;
        }

        //所有的控制器都位于Controller文件夹下
        $this->controller = '\Controller\\'.ucfirst($this->controller);
        $class = new $this->controller;
        $class->{$this->action}();
    }

}

文件:autoLoad.php

<?php
namespace Core;

/**
 * Class autoLoad
 * @param $classMap
 * @package Manager
 */
class autoLoad{

    /**
     * save the file path of class
     * @var array
     */
    public static $classMap = array();

    /**
     * include class
     * @param  $className
     * if the param is a string , it must be a namespace path
     * @author pig 2015-09-22
     */
    public static function loadClass($className){

        if(isset(self::$classMap[$className])){
            include self::$classMap[$className];
        }else{
            $className and $filePath = str_replace('\\','/',$className).'.php';
            if(!file_exists($filePath)){
                exit("file:$filePath is not exist");
            }
            self::$classMap[$className] = $filePath;
            include $filePath;
        }
        $result = class_exists($className,false) || interface_exists($className,false);
        if(!$result){
            exit("class:$className is not exist");
        }

    }

    /**
     * auto load register function
     * @author pig 2015-09-22
     */
    public static function run(){
         spl_autoload_register(__NAMESPACE__ .'\autoLoad::loadClass');
    }
}

使用:

文件:main.php

<?php
namespace Controller;
use Manager\BloggsManager;
use Html\Html;


class Main{
    public function index(){
        //BloggsManager::factory(1)->getAppEncoder()->encode();
        //$html = new Html();
        //$html->index();
        echo 'Hello word'a;
    }
}

在游览器中输入http://object.cm/index.php?r=main/index

(其中object.cm是我配置的域名,一般是localhost或127.0.0.1)

这样我们就可以访问Main控制器下的index方法了

目前只是一个大概,接下来才是任重而道远


© 著作权归作者所有

专业填坑
粉丝 5
博文 74
码字总数 9463
作品 0
广州
程序员
私信 提问
Unity进阶之:MVC编程思想

版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:)以及微信公众号"优梦创客" 您可以自由转载,但必须加入完整的版权声明! MVC 游戏初始化 在unity-start场景中,为了给整个游...

优梦创客
08/15
0
0
仿照源码,手写一个自定义 Spring MVC 框架

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/GitChat/article/details/97947618 前言 上节课我们学习了 Spring M...

GitChat技术杂谈
07/31
0
0
ASP.NET MVC是如何运行的[1]: 建立在“伪”MVC框架上的Web应用

ASP.NET由于采用了管道式设计,具有很好的扩展性,而整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的。通过上面对ASP.NET管道设计的介绍,我们知道ASP.NET的扩展点只要体现在HttpMoudle和...

长平狐
2012/09/04
125
0
手把手编写自己的PHP MVC框架实例教程

1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式。 MVC把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。 PHP中MVC模式也称W...

速贷100
2017/08/09
0
0
Javascript MVC 架构之旅

本文摘自smashingmagazine的Journey Through The JavaScript MVC Jungle部分内容,因为个人对于框架的应用总结和特点比较感兴趣,这里翻译了部分的内容,希望对于大家有帮助,如果你觉得不过...

gbin1
2012/09/11
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

elk 7.0 汉化文件

node_modules/x-pack/plugins/translations/translations/zh-CN.json

internetafei
13分钟前
0
0
TPCx-BB官宣最新世界纪录,阿里巴巴计算力持续突破

2019年9月17日,TPC官宣Alibaba Cloud MaxCompute认证结果。同月26日,杭州云栖大会阿里巴巴宣布了这一成绩,飞天大数据平台计算引擎MaxCompute成为全球首个TPCx-BB认证的公共云产品,是除H...

阿里云官方博客
17分钟前
0
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第8题

Choose the best answer The EMPLOYEES table contains columns EMP_ID of data type NUMBER and HIRE_DATE of data type DATE You want to display the date of the first Monday after the......

oschina_5359
26分钟前
0
0
本地文件/url获取文件类型

package com.cjw.baidu.ocr;import lombok.extern.slf4j.Slf4j;import org.apache.commons.lang3.StringUtils;import java.io.*;import java.net.HttpURLConnection;import ja......

jirak
27分钟前
0
0
使用koa-mysql-session时报错

描述 在本地测试代码没问题,但是部署到服务器上时就报错。 错误 > cross-env WEBPACK_TARGET=node NODE_ENV=production node ./server/app.jstruethe server is start at port 3333/usr...

xulonglong
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部