使用Composer从零开发一个简单的web框架(02)-框架初始化
Composer 自动加载配置
创建core
和app
目录,分别用于存放框架代码和应用代码
$ 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,这时我们会看到一个详细又漂亮的错误信息页面了
上面已经调试好开发环境的错误信息处理了,下面我们再调试下正式环境的错误信息处理
新建runtime
目录
$ pwd
/d/apps/wamp/www/phpweb
$ mkdir runtime -p
修改public/index.php
文件,设置APP_DEBUG
为false
// 是否调试
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_DEBUG
为true
// 是否调试
define('APP_DEBUG', true);
至此框架初始化相关的东西已经设置好了
关于 cli 命令行模式
项目支持在命令行下运行,当执行php public/index.php home/cron/onehour
命令时,框架会访问home
应用下的cron
控制器的onehour
函数
本作品采用《CC 协议》,转载必须注明作者和本文链接