欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

构建自个儿的PHP框架-抽象框架的内容

程序员文章站 2022-05-23 17:52:18
...
构建自己的PHP框架--抽象框架的内容

上一篇博客中,我们搭建了一个最简单的框架,从单一入口的public/index.php进入,解析出相应的Controller和Action,去执行,渲染出相应的页面或者输出相应的数据。

但是我们可以看到在public/index.php文件中,是一堆代码,如果之后,我要添加权限/事件等等的机制是不是也要也在这里,那不难想象,不就的将来,index.php就会变成一个巨大无比的php文件。我们当然不想看到这样的情景,所以我们需要将这些内容抽象出来,保持入口文件的简单明了。

那我们要将这些内容抽象到那里去呢?有聪明的同学已经想到了,就是之前在composer.json中定义的位置,我们来看一下composer.json文件:

{    "name": "craryprimitiveman/simple-framework",    "description": "A simple php framework",    "license": "MIT",    "authors": [        {            "name": "harrysun",            "email": "[email protected]"        }    ],    "require": {},    "autoload": {        "psr-4": {            "sf\\": "src/",            "app\\": ""        }    },    "repositories": [        {"type": "composer", "url": "http://packagist.phpcomposer.com"},        {"packagist": false}    ]}

可以看到autoload里的psr-4里还有个sf\\,他的地址是src/,这就是我们要放抽象出的内容的地方。

有人会问,为什么不直接使用app\\ 作为namespace呢?因为想到之后要将src下的内容做成一个composer包,迁移到vendor中。

下面就正式开始抽象了。

在src下创建两个文件夹,一个是base,一个是web。base用来存放基础的类,web用来存放与web相关的类。因为将来框架可能还要支持php脚本的执行,所以要将base和web分开,将来要加php脚本时,只需要建立一个console的文件夹就好了。

在两个文件夹中分别建立Application.php文件。

先来看在base里的Application.php

phpnamespace sf\base;use Exception;/** * Application is the base class for all application classes. * @author Harry Sun  */abstract class Application{    /**     * @var string the namespace that controller classes are located in.     * This namespace will be used to load controller classes by prepending it to the controller class name.     * The default namespace is `app\controllers`.     */    public $controllerNamespace = 'app\\controllers';    /**     * Runs the application.     * This is the main entrance of an application.     */    public function run()    {        try {            return $this->handleRequest();        } catch (Exception $e) {            return $e;        }    }    /**     * Handles the specified request.     */    abstract public function handleRequest();}

它是一个抽象类,实现了一个简单的run方法,run方法就是去执行以下handleRequest方法。

它定义了一个抽象方法handleRequest,等待被继承,实现。

它定义了一个controllerNamespace属性,记录controller存放的namesapce,默认值是'app\\controllers'。

再来看在web里的Application.php

phpnamespace sf\web;/** * Application is the base class for all application classes. * @author Harry Sun  */class Application extends \sf\base\Application{    /**     * Handles the specified request.     * @return Response the resulting response     */    public function handleRequest()    {        $router = $_GET['r'];        list($controllerName, $actionName) = explode('/', $router);        $ucController = ucfirst($controllerName);        $controllerName = $this->controllerNamespace . '\\' . $ucController . 'Controller';        $controller = new $controllerName();        return call_user_func([$controller, 'action'. ucfirst($actionName)]);    }}

是不是觉得很眼熟,其实就是将之前放在index.php中的内容放到Application的handleRequest方法里了。

然后我们需要从入口文件调用到这里的代码,这就很简单了,index.php的内容如下:

phprequire_once(__DIR__ . '/../vendor/autoload.php');$application = new sf\web\Application();$application->run();

直接去new一个web Application的实例,执行run方法就可以了,是不是很简单。

访问一下:http://localhost/simple-framework/public/index.php?r=site/test,你可以看到上一次一样的结果。

好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.2

blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

2楼阿水
顶一记!
Re: 疯狂的原始人
@阿水,谢谢支持~~
1楼玻璃鱼儿
PHP的命名空间为什么不和JAVA amp; .NET的类似都用点号分割呢??难道不能实现吗?不可能吧。非要独树一帜,看着别扭还难受。
Re: 疯狂的原始人
@玻璃鱼儿,PHP的namespace原生是不支持用点号分割,其实稍微早一点的框架的实现,是使用点号分割的,那时候PHP还没有支持namespace。
构建自个儿的PHP框架-抽象框架的内容

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

相关文章

相关视频


网友评论

文明上网理性发言,请遵守 新闻评论服务协议

我要评论
  • 构建自个儿的PHP框架-抽象框架的内容
  • 专题推荐

    作者信息
    构建自个儿的PHP框架-抽象框架的内容

    认证0级讲师

    推荐视频教程
  • 构建自个儿的PHP框架-抽象框架的内容javascript初级视频教程
  • 构建自个儿的PHP框架-抽象框架的内容jquery 基础视频教程
  • 视频教程分类