zoukankan      html  css  js  c++  java
  • 构建自己的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": "sunguangjun@126.com"
            }
        ],
        "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

    <?php
    namespace sfase;
    
    use Exception;
    
    /**
     * Application is the base class for all application classes.
     * @author Harry Sun <sunguangjun@126.com>
     */
    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 `appcontrollers`.
         */
        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

    <?php
    namespace sfweb;
    
    /**
     * Application is the base class for all application classes.
     * @author Harry Sun <sunguangjun@126.com>
     */
    class Application extends sfaseApplication
    {
        /**
         * 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的内容如下:

    <?php
    require_once(__DIR__ . '/../vendor/autoload.php');
    
    $application = new sfwebApplication();
    $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

  • 相关阅读:
    python入门-函数(二)
    python入门-函数(一)
    python入门-WHILE循环
    python入门-用户输入
    python入门-字典
    Spring Security授权 AccessDecisionManager
    Java的性能优化
    datahub
    vbs mytest
    spring发布和接收定制的事件(spring事件传播)
  • 原文地址:https://www.cnblogs.com/CraryPrimitiveMan/p/4787653.html
Copyright © 2011-2022 走看看