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

Composer 自动加载配置

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

$ pwd
/d/apps/wamp/www/phpweb

$ mkdir core app

$ ll
total 0
drwxr-xr-x 1 Administrator 197121 0 Apr 26 18:50 app/
drwxr-xr-x 1 Administrator 197121 0 Apr 26 18:50 core/
drwxr-xr-x 1 Administrator 197121 0 Apr 26 18:00 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 Apr 26 18:50 app/
-rw-r--r-- 1 Administrator 197121 116 Apr 26 18:53 composer.json
drwxr-xr-x 1 Administrator 197121   0 Apr 26 18:50 core/
drwxr-xr-x 1 Administrator 197121   0 Apr 26 18:00 public/
drwxr-xr-x 1 Administrator 197121   0 Apr 26 19:00 vendor/

框架入口

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

<?php
namespace core;


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

项目入口修改

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

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


// 是否调试
define('APP_DEBUG',     true);

// 根目录
define('PATH_ROOT',     __DIR__ . '/../');
// 应用目录
define('PATH_APP',      PATH_ROOT . 'app/');
// 运行时目录
define('PATH_RUNTIME',  PATH_ROOT . 'runtime/');
// 日志目录
define('PATH_LOG',      PATH_RUNTIME . 'log/');

// 默认应用
define('DEFAULT_APP',           'home');
// 默认控制器
define('DEFAULT_CONTROLLER',    'Index');
// 默认方法
define('DEFAULT_METHOD',        'index');


// 运行框架($argv 是命令行运行时的参数列表, 浏览器访问时为 null)
new \core\App($argv);

测试

浏览器访问 http://phpweb.com/home/hello/world,如果显示`uri:/home/hello/world`说明正确运行框架了

php 环境配置

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

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

<?php
namespace core;


/**
 * 确认目录存在
 * @param string $path
 */
function path_sure($path) {
    if (!file_exists($path)) mkdir($path, 0777, true);
}

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

<?php
namespace core;

require_once 'functions.php';

编辑core/App.php文件,添加setEnv成员函数

// php 环境配置
private function setEnv() {
    // 去除 警告、通知 等输出
    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'); //设置时区
}

编辑core/App.php文件,修改构造函数,主要是调用了环境变量设置的函数及一行会造成程序崩溃的代码

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

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

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

错误输出

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

添加Whoops依赖

$ pwd
/d/apps/wamp/www/phpweb

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

使用Whoops

// php 环境配置
private function setEnv() {
    // 去除 警告、通知 等输出
    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();
        // 命令行模式
        if ('cli' === PHP_SAPI) {
            $whoops->pushHandler(new \Whoops\Handler\PlainTextHandler());
        } else {
            $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://phpweb.com,这时我们会看到一个详细又漂亮的错误信息页面了

错误输出2

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

新建runtime目录

$ pwd
/d/apps/wamp/www/phpweb

$ mkdir runtime -p

修改public/index.php文件,设置APP_DEBUGfalse

// 是否调试
define('APP_DEBUG',     false);

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

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

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

// 是否调试
define('APP_DEBUG',     true);

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

关于 cli 命令行模式

项目支持在命令行下运行,当执行php public/index.php home/cron/onehour命令时,框架会访问home应用下的cron控制器的onehour函数

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

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