文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

admin

admin

2024-04-02 17:21

关注

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;



function path_sure($path) {
    if (!file_exists($path)) mkdir($path, 0777, true);
}

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

<?php
namespace core;


编辑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_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函数

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     428人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     199人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     159人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     239人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     62人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯