使用Composer从零开发一个简单的restful框架(02)-框架初始化

Composer 自动加载配置

新建coreapp目录,分别用于存放框架代码和应用代码

$ pwd
/d/apps/wamp/www/phpapi

$ mkdir core app

$ ll
total 0
drwxr-xr-x 1 Administrator 197121 0 May  3 15:23 app/
drwxr-xr-x 1 Administrator 197121 0 May  3 15:23 core/
drwxr-xr-x 1 Administrator 197121 0 May  3 15:05 public/

新建composer.json,内容如下

{
  "autoload": {
    "psr-4": {
      "core\\": "core/",
      "app\\": "app/"
    }
  }
}

运行composer dump-autoload命令生成自动加载相关的文件

$ composer dump-autoload
Generating autoload files
Generated autoload files

$ ll
total 1
drwxr-xr-x 1 Administrator 197121   0 May  3 15:23 app/
-rw-r--r-- 1 Administrator 197121 100 May  3 15:26 composer.json
drwxr-xr-x 1 Administrator 197121   0 May  3 15:23 core/
drwxr-xr-x 1 Administrator 197121   0 May  3 15:05 public/
drwxr-xr-x 1 Administrator 197121   0 May  3 15:26 vendor/

框架入口

新建core/App.php框架入口文件,内容如下

<?php
namespace core;


class App {
    public function __construct() {
        echo 'uri:' . $_SERVER['REQUEST_URI'];
    }
}

项目入口修改

编辑public/index.php,内容如下。主要是一些常量定义及加载框架

<?php
// composer 自动加载
require_once __DIR__ . '/../vendor/autoload.php';


// 是否调试
const APP_DEBUG = true;

// 应用控制器命名空间
const APP_CONTROLLER_NAMESPACE = 'app\controller';
// 全局中间件
const APP_MIDDLEWARES = [];

// 根目录
const PATH_ROOT = __DIR__ . '/../';
// 路由目录
const PATH_ROUTE = PATH_ROOT . 'route/';
// 运行时目录
const PATH_RUNTIME = PATH_ROOT . 'runtime/';
// 日志目录
const PATH_LOG = PATH_RUNTIME . 'log/';


// 运行框架
new \core\App();

测试

浏览器访问 http://phpapi.com/xxx/ooo,如果显示`uri:/xxx/ooo`说明正确运行框架了

php 环境配置

当开发项目遇到错误时,我们希望在网页上详细信息。而线上报错时,我们希望只显示一些简略信息给用户,然后把详细信息写入日志文件。此外还有一些其它比如时区的配置,我们希望每个项目不一样,所以不直接配置php.ini,因些只能利用ini_set来单独为每个项目设置环境配置

新建core/functions.php,内容如下。主要是提供一些常用功能函数,供框架和应用调用

<?php
namespace core;


/**
 * 确认目录存在
 * @param string $path
 * @return void
 */
function path_sure(string $path): void {
    if (file_exists($path)) return;

    mkdir($path, 0777, true);
}

/**
 * 前后增加斜杠
 * @param $content
 * @return void
 */
function slash_add(&$content): void {
    slash_add_head($content);
    slash_add_end($content);
}

/**
 * 前面增加斜杠
 * @param $content
 * @return void
 */
function slash_add_head(&$content): void {
    if (!$content) {
        $content = '/';
        return;
    }

    if ('/' != $content[0]) {
        $content = '/' . $content;
    }
}

/**
 * 后面增加斜杠
 * @param $content
 * @return void
 */
function slash_add_end(&$content): void {
    if (!$content) {
        $content = '/';
        return;
    }

    $lastChar = substr($content, -1);
    if ($lastChar != '/') {
        $content .= '/';
    }
}

编辑core/App.php,引入functions.php

<?php
namespace core;

require_once 'functions.php';

添加setEnv成员函数

// php 环境配置
private function setEnv(): void {
    // 去除 警告、通知 等输出
    error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE ^ E_STRICT ^ E_DEPRECATED);

    // 确认日志目录存在
    path_sure(PATH_LOG);

    if (APP_DEBUG) {
        ini_set('display_errors','On'); //调试模式网页显示错误信息
    } else {
        ini_set('display_errors','Off'); //线上模式网页不显示错误信息
        ini_set('log_errors', 'On'); //记录错误日志
        ini_set('error_log', PATH_LOG . 'php_errors.log'); //错误日志文件路径
    }
    ini_set('date.timezone','Asia/Shanghai'); //设置时区
}

修改构造函数,主要是调用了环境变量设置的函数及一行会造成程序崩溃的代码

public function __construct() {
    $this->setEnv();

    echo 'uri:' . $_SERVER['REQUEST_URI'];
    1 / 0;
}

浏览器访问 http://phpapi.com,我们会看到一个错误输出

错误输出

但这个错误输出相关信息太少了,如果是一个比较复杂的项目,我们可能需要知道 服务器信息、cookie、session 等相关数据,所以我们需要Whoops,显示更多和美观的错误信息页

添加Whoops依赖

$ pwd
/d/apps/wamp/www/phpapi

$ composer require filp/whoops
./composer.json has been updated
Using version ^2.15 for filp/whoops

使用Whoops

// php 环境配置
private function setEnv(): void {
    // 去除 警告、通知 等输出
    error_reporting(E_ALL ^ E_WARNING ^ E_NOTICE ^ E_STRICT ^ E_DEPRECATED);

    // 确认日志目录存在
    path_sure(PATH_LOG);

    if (APP_DEBUG) {
        ini_set('display_errors','On'); //调试模式网页显示错误信息

        $whoops = new \Whoops\Run();
        $whoops->pushHandler(new \Whoops\Handler\PrettyPageHandler());
        $whoops->register();
    } else {
        ini_set('display_errors','Off'); //线上模式网页不显示错误信息
        ini_set('log_errors', 'On'); //记录错误日志
        ini_set('error_log', PATH_LOG . 'php_errors.log'); //错误日志文件路径
    }
    ini_set('date.timezone','Asia/Shanghai'); //设置时区
}

浏览器访问 http://phpapi.com,这时我们会看到一个详细又漂亮的错误信息页面了

错误输出2

上面已经调试好开发环境的错误信息处理了,下面我们再调试下正式环境的错误信息处理

新建runtime目录

$ pwd
/d/apps/wamp/www/phpapi

$ mkdir runtime -p

修改public/index.php,设置APP_DEBUGfalse

// 是否调试
const APP_DEBUG = false;

浏览器访问 http://phpapi.com,我们只会在浏览器看到`uri:/`这样的输出,打开`runtime/log/php_errors.log`文件,错误信息已经记录到这个文件里了

[03-May-2024 15:53:01 Asia/Shanghai] PHP Fatal error:  Uncaught DivisionByZeroError: Division by zero in D:\apps\wamp\www\phpapi\core\App.php:12
Stack trace:
#0 D:\apps\wamp\www\phpapi\public\index.php(20): core\App->__construct()
#1 {main}
  thrown in D:\apps\wamp\www\phpapi\core\App.php on line 12

因为我们处于开发模式,重新设置APP_DEBUGtrue

// 是否调试
const APP_DEBUG = true;

至此框架初始化相关的东西已经设置好了

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!