写一个属于自己的PHP的MVC框架(二)

第一篇文章已经把所需的目录搭建好了,接下来的工作就是写一些代码了

用编辑器打开public/index.php文件,写上下面的代码

<?php

    define(DS, DIRECTORY_SEPARATOR);
    define(ROOT, dirname(dirname(__FILE__)));

    $url = $_GET['url'];

    // 加载引导
    require_once( ROOT . DS . 'core' . DS . 'bootstrap.php' );

入口文件的代码很简洁,其中$url是个全局变量,用来获取当做请求的参数

现在先把加载引导的那句注释掉,然后在下面echo $url,即

//require_once( ROOT . DS . 'core' . DS . 'bootstrap.php' );

echo $url;

然后在浏览器地址栏输入http://localhost/wudicsmvc/

注:D:\AppServ\www\wudicsmvc

然后,你会发现,啥也没显示。

接着输入http://localhost/wudicsmvc/wudics

就会发现网页打出wudics这几个字

说明可以正常获取url参数了,这个作为一个全局变量存在,主要用来获取客户端的请求

如访问哪个控制器的哪个方法

http://localhost/wudicsmvc/home/index

可以这样规定,访问home控制器的index方法,当然你也可以有不同的规定,也就是路由规则,据说是mvc一个很重要的概念

index.php文件没有啥内容,加载了一个bootstrap.php文件,打开core目录下的bootstrap.php文件:

<?php
    // 加载配置
    require_once(ROOT . DS . 'cfg' . DS . 'config.php');

    // 路由请求
    require_once(ROOT . DS . 'core' . DS . 'route.php');

同样加载了两个文件,一个是cfg目录下的config.php,一个是core目录下的route.php

看下config.php

<?php

    // mysql连接参数
    define('DB_HOST', 'localhost');
    define('DB_USER', 'root');
    define('DB_PASS', '123456');
    define('DB_NAME', 'transdb');

    // smarty的一些常量
    define('DIR_TPL', ROOT . DS . 'app' . DS . 'view' . DS . 'template_dir' . DS . 'default' . DS);
    define('DIR_CPL', ROOT . DS . 'app' . DS . 'view' . DS . 'compile_dir' . DS);
    define('DIR_CFG', ROOT . DS . 'app' . DS . 'view' . DS . 'config_dir' . DS);
    define('DIR_CAC', ROOT . DS . 'app' . DS . 'view' . DS . 'cache_dir' . DS);

    // 默认控制类方法
    $default['controller'] = 'home';
    $default['action'] = 'index';

    // pulibc文件夹的路径,方便模板设计
    define('WEBSITE', 'http://localhost');
    define('WEBIMG', WEBSITE . dirname(dirname($_SERVER['PHP_SELF'])) . '/public/img/');

一些常量和全局变量,这个很有用,因为常量和全局变量在单一入口php程序里都是共享的资源

然后是route.php文件

<?php

    function callHook()
    {
        global $url;
        global $default;

        // Get the $controller $action $param
        $param = array();

        $urlArr = explode("/", rtrim($url, "/"));
        $controller = array_shift($urlArr);
        $action = array_shift($urlArr);
        $param = $urlArr;

        if ($controller == "")
        {
            $controller = $default['controller'];
            $action = $default['action'];
        }

        if ($action == "")
        {
            $action = $default['action'];
        }

        // 控制类书写规则 HomeController->Index
        $controllerName = ucfirst($controller).'Controller';
        $dispatch = new $controllerName($controller, $action);

        if (method_exists($dispatch, ucfirst($action)))
        {
            call_user_func_array(array($dispatch, ucfirst($action)), $param);
        }
        else
        {
            /* Error Code for Method is not exists */
            die('method not exitsts.<br />');
        }
    }

    // 自动加载类
    function __autoload($classname)
    {
        if (file_exists(ROOT . DS . 'core' . DS . strtolower($classname) . '.class.php'))
        {
            require_once(ROOT . DS . 'core' . DS . strtolower($classname) . '.class.php');
        }
        else if (file_exists(ROOT . DS . 'app' . DS . 'controller' . DS . strtolower($classname) . '.php'))
        {
            require_once(ROOT . DS . 'app' . DS . 'controller' . DS . strtolower($classname) . '.php');
        }
        else if (file_exists(ROOT . DS . 'app' . DS . 'model' . DS . strtolower($classname) . '.php'))
        {
            require_once(ROOT . DS . 'app' . DS . 'model' . DS . strtolower($classname) . '.php');
        }
        else
        {
            /* Error Code for can not find the files */
            die('class not found.<br />');
        }
    }

    callHook();

这个页面,首先定义了两个函数callHook和__autoload,然后页面底部有一句callHook();到此,程序就开始执行了。

callHook函数:

其作用就是定位上面所说的控制器,方法,参数

当代码执行这里时

// 控制类书写规则 HomeController->Index
        $controllerName = ucfirst($controller).'Controller';
        $dispatch = new $controllerName($controller, $action);

程序就会执行__autoload方法,这个方法可以在你使用类的时候可以自动加载所需的文件

不需要手动require,这样可以方便的时候各种类库,方便省事,不需要每次调用类之前都手动加载.php类文件

method_exists方法判断这个类中是不是存在该方法,若存在,就call_user_func_array调用该方法

注:__autoload方法是一些加载类库文件的规则,这个要根据你的习惯来定义的。

至此,程序就跳到某某控制器的某某方法执行了。比如说HomeController类中的Index方法,该文件就在你的__autoload规则里定义着。

我这里的就是app/controller/homecontroller.php文件了

<?php

class HomeController extends Controller
{
    public function Index()
    {
        $user = new user();
        $tpl = new tpl();
        $tpl->set('name', $user->name);
        $tpl->render('index.html');
    }
}

这个方法里加载了user类(Model)和tpl类(view)

user类负责从数据库读数据

tpl类负责把显示数据

所以也可以这样说,controller类起到了一个连接的作用,控制着数据和显示,使两者可以很好的绑定在一起,model和view就分开了

这样做就可以实现了当初的想法,把php代码和html布局分离开来

我期待我能够整合出一个属于自己的方便使用的php框架,希望大家来QQ群给点意见,QQ群号:667110936671109366711093

时间: 2024-10-01 12:34:39

写一个属于自己的PHP的MVC框架(二)的相关文章

写一个属于自己的PHP的MVC框架(一)

最近想做个PHP的个人博客作为学习用,但是发现尽管把PHP函数用得很熟悉了,按照常规的办法,写一个页面处理一个请求,仅仅一个博客就可能有很多个页面,而且php代码和html代码都结合的非常紧密,如果想要实现更换皮肤的功能,就显得非常无力.在网上找了好多framework框架,但似乎又要开始学习新的一门知识,现在还没有用来做具体开发,所以放弃了使用这些复杂的东西. 这里写这篇文章,其目的能做下笔记,也能为大多数困惑的PHP爱好者提供一些个人的想法. 首先吧,MVC就是model,view,cont

分享一个UI与业务逻辑分层的框架(二)

序言 第一篇讲解了UI与业务逻辑分层的框架(UIMediator)的使用.本篇将说明该框架的原理及代码实现. 整体结构 UI与后台类绑定主要分为UI输入->后台属性,后台属性-UI更新两部分,为符合依赖倒置原则,分别抽象出IUIToProperty和IPropertyToUI两个接口. 为了匹配WinForm的窗体事件委托方法格式(object sender, EventArgs e)两个接口方法都实现了多态. Mediator采用了模板方法的设计模式,实现了整个绑定方法的算法框架,子类只需实现

自己动手写PHP MVC框架

来自:yuansir-web.com / [email protected] 代码下载: https://github.com/yuansir/tiny-php-framework PHP的框架众多,对于哪个框架最好,哪个框架最烂,是否应该用框架,对于这些争论在论坛里面都有人争论,这里不做评价, 个人觉得根据自己需求,选中最佳最适合自己MVC框架,并在开发中能够体现出敏捷开发的效果就OK了,作为一个PHPer要提高自己的对PHP和MVC的框架的认识,所以自己写一个MVC框架是很有必要的, 即使不

【转载】如何写一个框架:步骤(下)

说明:写本文的时候作者完全是把脑子里的东西写了出来,没有参考任何的资料,所以对于每一项内容可能都是不完整的,不能作为一个完整的参考.有一些方法学的东西每个人都有自己的喜好,没有觉得的对和错. 单元测试 在这之前我们写的框架只能说是一个在最基本的情况下可以使用的框架,作为一个框架我们无法预测开发人员将来会怎么使用它,所以我们需要做大量的工作来确保框架不但各种功能都是正确的,而且还是健壮的.写应用系统的代码,大多数项目是不会去写单元测试的,原因很多: 项目赶时间,连做一些输入验证都没时间搞,哪里有时

写一个框架的详细步骤

定位 所谓定位就是回答几个问题,我出于什么目的要写一个框架,我的这个框架是干什么的,有什么特性适用于什么场景,我的这个框架的用户对象是谁,他们会怎么使用,框架由谁维护将来怎么发展等等. 如果你打算写框架,那么肯定心里已经有一个初步的定位,比如它是一个缓存框架.Web MVC框架.IOC框架.ORM/数据访问框架.RPC框架或是一个用于Web开发的全栈式框架. 是 否要重复造轮子?除非是练手项目,一般我们是有了解决不了问题的时候才会考虑不使用既有的成熟的框架而重复造轮子的,这个时候需要列出新框架主

如何写一个框架

定位 所谓定位就是回答几个问题,我出于什么目的要写一个框架,我的这个框架是干什么的,有什么特性适用于什么场景,我的这个框架的用户对象是谁,他们会怎么使用,框架由谁维护将来怎么发展等等. 如果你打算写框架,那么肯定心里已经有一个初步的定位,比如它是一个缓存框架.Web MVC框架.IOC框架.ORM/数据访问框架.RPC框架或是一个用于Web开发的全栈式框架. 是否要重复造轮子?除非是练手项目,一般我们是有了解决不了问题的时候才会考虑不使用既有的成熟的框架而重复造轮子的,这个时候需要列出新框架主要

手把手编写自己的PHP MVC框架实例教程

1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式. MVC把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). PHP中MVC模式也称Web MVC,从上世纪70年代进化而来. MVC的目的是实现一种动态的程序设计,便于后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能. 除此之外,此模式通过对复杂度的简化,使程序结构更加直观. MVC各部分的职能: 模型Model – 管理大部分

使用PHP搭建自己的MVC框架

一.什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能.除此之外,此模式通过对复杂度的简化,使程序结构更加直观.软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能.专业人员可以通过自身的专长分组: (控制器Controlle

设计 REST 风格的 MVC 框架

http://www.ibm.com/developerworks/cn/java/j-lo-restmvc/ 传统的 JavaEE MVC 框架如 Struts 等都是基于 Action 设计的后缀式映射,然而,流行的 Web 趋势是 REST 风格的架构.尽管使用 Filter 或者 Apache mod_rewrite 能够通过 URL 重写实现 REST 风格的 URL,为什么不直接设计一个全新的 REST 风格的 MVC 框架呢? 本文将讲述如何从头设计一个基于 REST 风格的 Ja