系列文章---框架篇:4.入口文件

回顾

上一节我们完成了从路由解析到数据输出的过程,并且之前已经完成了Request的编写,这一节我们写完入口文件,真正的将我们的web应用跑起来了。


入口文件里需要做些什么呢?

还记得那个流程图吗?

简单流程图

我们需要加载配置,实例化Application并运行,并且引入后面可能遇到的一些常量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

require __DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'library'.DIRECTORY_SEPARATOR.'System.php';

// 加载配置
$config = require SF_LIBRARY_PATH.'Config.php';


$config['debug'] = ($config['debug']?? SF_DEBUG);

if ($config['debug']) {
ini_set("display_errors", "On");
error_reporting(E_ALL);
}

// composer自动加载
require __DIR__ . '/../vendor/autoload.php';

// 实例化应用并运行
$app = new Library\Application(new Library\Https\Request() ,$config);
$app->run();

知识点:

  1. __DIR__是PHP的一个魔术常量,可以理解成当前文件所在路径。DIRECTORY_SEPARATOR是一个显示系统分隔符的命令,DIRECTORY_SEPARATOR是PHP的内部常量,不需要任何定义与包含即可直接使用。
  2. ini_set — 为一个配置选项设置值
  3. error_reporting — 设置应该报告何种 PHP 错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

// Turn off all error reporting
error_reporting(0);

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
error_reporting(E_ALL & ~E_NOTICE);

// Report all PHP errors (see changelog)
error_reporting(E_ALL);

// Report all PHP errors
error_reporting(-1);

// Same as error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

?>

System.php

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

// debug默认开启
defined('SF_DEBUG') or define('SF_DEBUG', true);
// 框架开始运行时间
defined('SF_START_TIME') or define('SF_START_TIME', microtime(true));
// 核心文件目录
defined('SF_LIBRARY_PATH') or define('SF_LIBRARY_PATH', __DIR__.DIRECTORY_SEPARATOR);
// 应用目录
defined('SF_APP_PATH') or define('SF_APP_PATH', __DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'app'.DIRECTORY_SEPARATOR);
// 入口目录
defined('SF_PUBLIC_PATH') or define('SF_PUBLIC_PATH', __DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'public'.DIRECTORY_SEPARATOR);

Config.php

1
2
3
4
5
6
7
<?php
/**
* 系统配置
*/
return [
'debug' => true, // 建议开发过程中开启
];

到这里,我们的框架已经可以运行起来了。

运行应用

配置Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
server {
listen 80;
server_name saif.com;
# 框架根目录
root /Users/sai/Work/www/saif/public;


location / {
index index.html index.htm index.php;
try_files $uri $uri/ /index.php?$query_string;
}


error_page 500 502 503 504 /50x.html;
location = /50x.html {
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

浏览器输入http://saif.com。

你会看到返回的json数组:

框架入口

备注:前面3行请忽略,是我浏览器的插件自动加入的。

到这里,我们已经完成了基础API框架的开发。