00x0 环境搭建
下载:https://getcomposer.org/download/
php
D:\phpstudy_pro\Extensions\php\php-8.4.16\php.exe D:\composer.phar install
cd C:\Users\jc\Desktop\Slim-4.x
D:\phpstudy_pro\Extensions\php\php-8.4.16\php.exe -S localhost:9999 -t public
开启成功
php需要大于8.0

00x1 php框架概念
PHP框架就是一种可以在项目开发过程中,提高开发效率,创建更为稳定的程序,并减少开发者重复编写代码的基础架构。PHP框架是将不同Web系统开发过程中的共性、通用部分功能进行抽象,形成开发Web程序的基本架构。进行Web系统开发时,开发人员如果在PHP框架基础上进行二次开发,即可大大简化开发过程,快速实现系统功能。PHP框架能促进Web系统的快速开发、节约时间、减少重复代码量,并能帮助初学者创建规范、稳定的Web系统。
框架它提供了一套标准的开发流程和工具集,包括数据库操作、路由管理、模板引擎、安全机制等,旨在提高开发效率和代码质量。
框架的优势
- 加速开发:通过预定义的代码结构和库,减少重复编写代码的时间。
- 易于维护:清晰的代码结构和文档,便于团队协作和维护。
- 安全性高:框架内置的安全机制可以有效防止常见的安全漏洞。
- 扩展性强:丰富的社区支持和插件库,易于集成第三方服务。
常见php框架有 Zend Framework ,CakePHP, Yii, ThinkPHP ,Codelgniter
参考:https://developer.baidu.com/article/details/3322267
https://baike.baidu.com/item/PHP%E6%A1%86%E6%9E%B6/5845631
00x2 Slim-4.x 简介
Slim 4 是一个微型 PHP 框架,用于构建简单的、强大的 web 应用程序和 API。它提供了路由、中间件和依赖注入等核心功能,使得开发者能够快速构建高性能的应用程序。
使用此框架应用程序快速设置并开始处理新的Slim Framework 3应用程序。此应用程序使用最新的Slim 3和PHP-View模板渲染器。它还使用Monolog记录器。
此框架应用程序是为Composer构建的。这样可以快速轻松地设置新的Slim Framework应用程序。
源码以及文档 https://github.com/slimphp/Slim
参考 https://blog.csdn.net/gitblog_00758/article/details/141841432
https://www.cnblogs.com/xdtx/p/10948562.html
00x3 Composer
Composer 不是一个包管理器(包管理器类似python的pip,Node的npm)。是的,它涉及 "packages" 和 "libraries",但它在每个项目的基础上进行管理,在你项目的某个目录中(例如 vendor)进行安装。默认情况下它不会在全局安装任何东西。因此,这仅仅是一个依赖管理。
也就是说Composer依赖下载的组件只在一个项目内生效。
这种想法并不新鲜,Composer 受到了 node's npm 和 ruby's bundler 的强烈启发。而当时 PHP 下并没有类似的工具。
Composer 将这样为你解决问题:
a) 你有一个项目依赖于若干个库。
b) 其中一些库依赖于其他库。
c) 你声明你所依赖的东西。
d) Composer 会找出哪个版本的包需要安装,并安装它们(将它们下载到你的项目中)。
参考 https://docs.phpcomposer.com/00-intro.html
如果没有Composer,你得去 GitHub 或 Packagist 一个个下载
· slim/slim 主包
· psr/container(slim 依赖的)
· psr/http-message(slim 和 guzzle 都依赖的)
· monolog/monolog 主包
· psr/log(monolog 依赖的)
· guzzlehttp/guzzle 主包
· psr/http-client(guzzle 依赖的)
解决版本兼容问题等等
有了composer后,运行 composer install,它自动下载所有包(包括传递依赖),并且自动处理好版本冲突------如果发现冲突,它会直接报错告诉你"无法安装",而不是让你陷入手动调版本的泥潭。
运行 composer install 时,Composer 通过composer.json寻找需要下载的库并把组件代码下载到 vendor 目录
php
//composer.json
{
//包名
"name": "slim/slim",
//什么类型
//这是一个库
"type": "library",
//注释
"description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
//注释
"keywords": ["framework","micro","api","router"],
//版权信息
"homepage": "https://www.slimframework.com",
//作者
"license": "MIT",
//找帮助
"authors": [
{
"name": "Josh Lockhart",
"email": "hello@joshlockhart.com",
"homepage": "https://joshlockhart.com"
},
{
"name": "Andrew Smith",
"email": "a.smith@silentworks.co.uk",
"homepage": "https://silentworks.co.uk"
},
{
"name": "Rob Allen",
"email": "rob@akrabat.com",
"homepage": "https://akrabat.com"
},
{
"name": "Pierre Berube",
"email": "pierre@lgse.com",
"homepage": "https://www.lgse.com"
},
{
"name": "Gabriel Manricks",
"email": "gmanricks@me.com",
"homepage": "http://gabrielmanricks.com"
}
],
//文档
"support": {
"docs": "https://www.slimframework.com/docs/v4/",
"forum": "https://discourse.slimframework.com/",
"irc": "irc://irc.freenode.net:6667/slimphp",
"issues": "https://github.com/slimphp/Slim/issues",
"rss": "https://www.slimframework.com/blog/feed.rss",
"slack": "https://slimphp.slack.com/",
"source": "https://github.com/slimphp/Slim",
"wiki": "https://github.com/slimphp/Slim/wiki"
},
//equire 是一个键,它的值是一个对象(用 {} 包裹)
"require": {
//兼容版本范围
"php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0",
//开启extension扩展
"ext-json": "*",
//nikic/fast-route路由也是标识符,文件夹路径,^1.3版本限制
"nikic/fast-route": "^1.3",
"psr/container": "^1.0 || ^2.0",
"psr/http-factory": "^1.1",
"psr/http-message": "^1.1 || ^2.0",
"psr/http-server-handler": "^1.0",
"psr/http-server-middleware": "^1.0",
"psr/log": "^1.1 || ^2.0 || ^3.0"
},
//开发依赖
"require-dev": {
//SimpleXML拓展
"ext-simplexml": "*",
"adriansuter/php-autoload-override": "^1.4 || ^2",
"guzzlehttp/psr7": "^2.6",
"httpsoft/http-message": "^1.1",
"httpsoft/http-server-request": "^1.1",
"laminas/laminas-diactoros": "^2.17 || ^3",
"nyholm/psr7": "^1.8",
"nyholm/psr7-server": "^1.1",
"phpspec/prophecy": "^1.19",
"phpspec/prophecy-phpunit": "^2.1",
"phpstan/phpstan": "^1 || ^2",
"phpunit/phpunit": "^9.6 || ^10 || ^11 || ^12",
"slim/http": "^1.3",
"slim/psr7": "^1.6",
"squizlabs/php_codesniffer": "^3.10",
"vimeo/psalm": "^5 || ^6"
},
//自动加载规则,所有Slim\\命名的命名空间去Slim文件夹下找对应的php文件
//如new Slim\APP(),Slim/App.php
//当你执行 composer install 后,Composer 会根据 autoload 配置生成一个文件:
//vendor/autoload.php。
//你在项目入口引入它才可以使用
//require __DIR__ . '/../vendor/autoload.php'
"autoload": {
"psr-4": {
"Slim\\": "Slim"
}
},
"autoload-dev": {
"psr-4": {
"Slim\\Tests\\": "tests"
}
},
//这是为开发者定义的快捷命令。在命令行直接运行 composer test,Composer 就会依次执行 phpunit、phpcs、phpstan、psalm 这些命令,相当于一键运行整个测试和检查流程。@phpunit 这种写法就是调用下面定义的 phpunit 脚本。
//composer命令开始自动执行
"scripts": {
"test": [
"@phpunit",
"@phpcs",
"@phpstan",
"@psalm"
],
"phpunit": "phpunit",
"phpcs": "phpcs",
"phpstan": "phpstan --memory-limit=-1",
"psalm": "psalm --no-cache"
},
//这里是一些可选建议,告诉使用者如果想用某些特性,需要额外安装什么。
"suggest": {
"ext-simplexml": "Needed to support XML format in BodyParsingMiddleware",
"ext-xml": "Needed to support XML format in BodyParsingMiddleware",
"slim/psr7": "Slim PSR-7 implementation. See https://www.slimframework.com/docs/v4/start/installation.html for more information.",
"php-di/php-di": "PHP-DI is the recommended container library to be used with Slim"
},
//这是一些给 Composer 本身用的配置。sort-packages 意思是当你用 require 命令安装新包时,会自动在 composer.json 的 require 列表里按包名排序,保持文件整洁。
//当你用 composer require 命令下载新包时,Composer 会自动做两件事:
//把这个新包的条目添加到 composer.json 的 require(或 require-dev)列表里。
//同时下载这个包的代码到 vendor 目录。
/*1. Composer(通过 composer.phar)读取当前目录下的 composer.json 文件,里面记录着项目的依赖清单。
2. 根据清单里的包名和版本约束,去仓库(如 Packagist)查找并下载对应的代码,放到 vendor 目录里。
3. 当你以后想安装新的包时,直接运行 composer require 包名,Composer 不仅会把包下载下来,还会自动把这条新依赖写入 composer.json 的 require 部分(如果开启了排序,还会按字母顺序排好)。同时,它也会更新 composer.lock 文件,记下所有包的精确版本。*/
"config": {
"sort-packages": true
}
}
php
<?php
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
//检查 HTTP 响应头是否已经被发送到浏览器。
if (!headers_sent()) {
//没有就500
header('HTTP/1.1 500 Internal Server Error');
}
//php_eol是一个已经定义好的变量,代表php的换行符,这个变量会根据平台而变,在windows下会是"/r/n",在linux下是"/n",在mac下是"/r"
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
//主要用于获取php.ini配置文件中的指定选项值。其语法为,通过传入配置变量名返回对应的字符串值,布尔型配置项则返回0或1。
//如果没有配置
if (!ini_get('display_errors')) {
//内置调试器
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
//fwrite()是PHP编程语言中用于向文件写入数据的核心函数
//写入信息
//错误流,输出到面板STDERR
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
//抛出报错,脚本停止
throw new RuntimeException($err);
}
//引用文件
require_once __DIR__ . '/composer/autoload_real.php';
// 调用自动加载器类的静态方法 getLoader(),返回已注册的自动加载器实例
// 这个返回值通常不会直接使用,但 Composer 内部通过它完成自动加载注册
//自动加载核心判断
return ComposerAutoloaderInit7ab6fc67c2c3b4adad7f8aabf0580255::getLoader();
00x4 依赖
什么是依赖(Dependencies)?
依赖就是你的程序要"借力"的外部资源,通常是库、工具或框架。它们就像搭积木时用的现成模块,让你不用事事从零做起。
比如:
写 Python 的时候,会用 requests 这个库来抓网页数据;
前端项目常用 React.js 来搭建界面。
这些依赖本身也不是"孤岛",它们往往也依赖其他东西。比如 React 需要某个版本的 Node.js,而 Node 也可能有自己的依赖链。这个结构就像俄罗斯套娃,层层叠叠,错一个都不行。
依赖存在的意义在于:
提升效率:你只需要关注项目核心逻辑,重复的功能可以直接用别人的成果;
系统更稳更好扩展:很多库是大型社区维护的,已经在各种项目中验证过,拿来用更省心。
但这也意味着,如果你装了不合适的版本,或者哪一环有冲突,问题就会像连环雷一样爆出来,而且往往不好查。
依赖 ≈ 组件 ≈ 第三方库。
参考:https://blog.csdn.net/2509_92130319/article/details/148064779
00x5 Slim框架结构
Slim框架十分简洁
vendor是依赖文件包
public是web服务根目录入口文件
sLIM框架本体

00x6 Slim路由规则
php
<?php
//use为类起一个别名
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
//导入工厂类
use Slim\Factory\AppFactory;
//引用文件,规则加载
//自动加载规则,所有Slim\\命名的命名空间去Slim文件夹下找对应的php文件
//如new Slim\APP(),Slim/App.php
require __DIR__ . '/../vendor/autoload.php';
//发力了
//自动触发加载器
//::调用静态方法
//create()实例化App()
$app = AppFactory::create();
//注册get请求,传路由路径
// · $request:当前 HTTP 请求对象,包含请求参数、头信息等。
// · $response:当前 HTTP 响应对象,用于构建返回内容。
// · $args:路由参数数组(本例中没有动态参数,所以为空)。
$app->get('/', function (Request $request, Response $response, $args) {
//获取响应,写入"Hello, Slim!"
$response->getBody()->write("Hello, Slim!");
//返回给框架
return $response;
});
//运行应用
$app->run();
php
//public static function create(): App {方法签名
//返回APP类型
//{方法体执行里面的代码
public static function create(
//组件
//可选,可选数量,有默认
?ResponseFactoryInterface $responseFactory = null,
?ContainerInterface $container = null,
?CallableResolverInterface $callableResolver = null,
?RouteCollectorInterface $routeCollector = null,
?RouteResolverInterface $routeResolver = null,
?MiddlewareDispatcherInterface $middlewareDispatcher = null
): App {
static::$responseFactory = $responseFactory ?? static::$responseFactory;
//返回
return new App(
//调用静态方法
self::determineResponseFactory(),
$container ?? static::$container,
$callableResolver ?? static::$callableResolver,
$routeCollector ?? static::$routeCollector,
$routeResolver ?? static::$routeResolver,
$middlewareDispatcher ?? static::$middlewareDispatcher
);
}