当前位置:  开发笔记 > 编程语言 > 正文

一步步编写PHP的Framework(三)

按照上一次我讲的内容,一个基本的MVC构架是已经搭建起来了的,但是本身还存在很多问题,如:模型这一块儿每次连接DB,关闭DB的代码冗余,视图这一块儿还是PHP代码,每个文件要使用很多include代码等等...">

 

        按照上一次我讲的内容,一个基本的MVC构架是已经搭建起来了的,但是本身还存在很多问题,如:模型这一块儿每次连接DB,关闭DB的代码冗余,视图这一块儿还是PHP代码,每个文件要使用很多include代码等等。

        要编写一个框架,那么首先就要规定一个标准的目录结构,我们暂时把这个目录结构定死,不允许用户修改,这样可以减少代码量,方便大家看的更明白。

        由于之前编写了Toper,所以我准备沿用Toper的目录结构来做演示:

 Library(框架存放目录)

Test(假设这个框架名就叫test)

UserApps (用户的APP存放目录)

Configs(配置文件存放目录)

Modules(模块存放目录)

Controllers (所有控制器存放目录)

Models (模型存放目录)

Views (视图存放目录)

Helpers (辅助文件目录)

Plugins(插件存放目录,暂时用不上)

Public (网站根目录)

index.php (最重要的入口文件)

       这个地方有点需要解释一下,Public目录才是网站的根目录,Library目录和UserApps目录是存放在网站根目录之外的,这样用户通过浏览器访问时就不能直接访问这个PHP文件,这样可以提高网站的安全性。

  之前我们把路由的功能全部放在入口文件这一块儿,实际上这是不合适的,入口文件不应该做这些逻辑的处理,所以我们把之前存放在入口文件的代码迁移到library目录的Test目录下面,由于之前在入口文件中完成的功能是路由,所以我们把代码迁移到Route.php,这个文件就完成路由的功能。

        好,我们来看看Route.php这个文件的内容:

01
02 class Route {
03     public static function run() {
04         $controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //设置了默认的控制器
05         $action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //设置了默认的Action
06         $controllerBasePath = dirname(__FILE__) . '/../../UserApps/Modules/Controllers/';
07         $controllerFilePath = $controllerBasePath . $controller . 'Controller.php';
08         if(is_file($controllerFilePath)) {
09             include $controllerFilePath;
10             $controllerName = $controller . 'Controller';
11             if(class_exists($controllerName)) {
12                 $controllerHandler = new $controllerName();
13                 if(method_exists($controllerHandler,$action)) {
14                     $controllerHandler->$action();
15                 } else {
16                     echo 'the method does not exists';
17                 }
18             } else {
19                 echo 'the class does not exists';
20             }
21         } else {
22             echo 'controller not exists';
23         }
24     }
25 }

        这个时候,看到没,我们只是把之前放在入口文件的代码拷贝到Route.php这个文件中了,那么这样有什么好处呢?

        入口文件代码少了!!!

1
2 include dirname(__FILE__) . '/../Library/Test/Route.php';
3 Route::run();

       只有两行的代码,够简洁吧!!

       但是你看到一个问题没有,每次我都需要使用dirname来确定当前路径,而如果这个框架中有20个文件,每个文件中有3处使用dirname来获取绝对路径,那么感觉到恐怖了吧,90处重复代码,如果以后路径一修改,那将会是你的噩梦!!

        所以,我们不妨在入口文件定义一个路径,这个路径作为APP的基路径,由于我们经常也会使用Library下面的Test目录路径,我们也设置一个框架路径,所以,入口文件修改为:

1
2 defined('APP_PATH') || define('APP_PATH',dirname(__FILE__) . '/..');
3 defined('FRAMEWORK_PATH') || define('FRAMEWORK_PATH',APP_PATH . '/Library/Test');
4 include FRAMEWORK_PATH . '/Route.php';
5 Route::run();

      那么Route.php相应的也需要修改:

01
02 class Route {
03     public static function run() {
04         $controller = empty($_GET['c']) ? 'Index' : trim($_GET['c']); //设置了默认的控制器
05         $action = empty($_GET['a']) ? 'index' : trim($_GET['a']); //设置了默认的Action
06         $controllerBasePath = APP_PATH . '/UserApps/Modules/Controllers/';
07         $controllerFilePath = $controllerBasePath . $controller . 'Controller.php';
08         if(is_file($controllerFilePath)) {
09             include $controllerFilePath;
10             $controllerName = $controller . 'Controller';
11             if(class_exists($controllerName)) {
12                 $controllerHandler = new $controllerName();
13                 if(method_exists($controllerHandler,$action)) {
14                     $controllerHandler->$action();
15                 } else {
16                     echo 'the method does not exists';
17                 }
18             } else {
19                 echo 'the class does not exists';
20             }
21         } else {
22             echo 'controller not exists';
23         }
24     }
25 }

      现在看这个代码是不是要好多了!!! 

       但是通过MVC来构建应用的时候,经常会一个文件include很多类,那么是否框架可以实现自动导入类,而不采用手动include呢,请继续关注我的日志!!


推荐阅读
  • 掌握PHP框架开发与应用的核心知识点:构建高效PHP框架所需的技术与能力综述
    掌握PHP框架开发与应用的核心知识点对于构建高效PHP框架至关重要。本文综述了开发PHP框架所需的关键技术和能力,包括但不限于对PHP语言的深入理解、设计模式的应用、数据库操作、安全性措施以及性能优化等方面。对于初学者而言,熟悉主流框架如Laravel、Symfony等的实际应用场景,有助于更好地理解和掌握自定义框架开发的精髓。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • Python作为当今IT领域中最受欢迎且高效的语言之一,其框架能够显著加速Web应用程序的开发过程。本文推荐并对比了十大顶级Python Web开发框架,其中CubicWeb以其卓越的代码重用性和模块化设计脱颖而出,为开发者提供了强大的支持。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 全面解析Java虚拟机:内存模型深度剖析 ... [详细]
  • 成功实现Asp.Net MVC3网站与MongoDB数据库的高效集成
    我们成功地构建了一个基于Asp.NET MVC3框架的网站,并实现了与MongoDB数据库的高效集成。此次更新不仅完善了基本的创建和显示功能,还全面实现了数据的增删改查操作。在创建功能方面,我们修复了之前代码中的错误,确保每个属性都能正确生成。此外,我们还对数据模型进行了优化,以提高系统的性能和稳定性。 ... [详细]
  • MVVM架构~mvc,mvp,mvvm大话开篇
    返回目录百度百科的定义:MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:ControllerPresenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模 ... [详细]
  • 深入理解Java事务编程:可串行化隔离级别的快照隔离机制解析
    深入理解Java事务编程:可串行化隔离级别的快照隔离机制解析 ... [详细]
  • 深入解析 Spring MVC 的核心原理与应用实践
    本文将详细探讨Spring MVC的核心原理及其实际应用,首先从配置web.xml文件入手,解析其在初始化过程中的关键作用,接着深入分析请求处理流程,包括控制器、视图解析器等组件的工作机制,并结合具体案例,展示如何高效利用Spring MVC进行开发,为读者提供全面的技术指导。 ... [详细]
  • 利用ViewComponents在Asp.Net Core中构建高效分页组件
    通过运用 ViewComponents 技术,在 Asp.Net Core 中实现了高效的分页组件开发。本文详细介绍了如何通过创建 `PaginationViewComponent` 类并利用 `HelloWorld.DataContext` 上下文,实现对分页参数的定义与管理,从而提升 Web 应用程序的性能和用户体验。 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
author-avatar
呼吸乱了的声音_648
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有