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