gpcosta / thats-it
这是一个用于个人项目的简单PHP框架。易于使用……就这么简单!
Requires
- php: >=7.2
- ext-curl: *
- ext-fileinfo: *
- ext-json: *
- ext-mbstring: *
- ext-pdo: *
- ezyang/htmlpurifier: ^4.12
- filp/whoops: ^2.4
- firebase/php-jwt: ^5.2
- godruoyi/php-snowflake: ^1.0
- monolog/monolog: ^1.24
- mustache/mustache: ^2.13
- neitanod/forceutf8: ^2.0
- nikic/fast-route: ^1.3
This package is auto-updated.
Last update: 2024-09-14 16:29:33 UTC
README
这是一个用于个人项目的简单PHP框架。易于使用……就这么简单!
想象一下,你喜欢创造事物,你也喜欢使用PHP... 你现在如何开始你的项目?或者你只是用纯PHP开始,或者使用众多框架中的一个?虽然它们很棒,但它们很重,而且大多数时候它们有很多过度的特性。
所以,因为我有很多空闲时间(只是开个玩笑),我开始创建自己的框架。可能是世界上第一个VC框架,因为我只需要控制器和视图。为什么不呢?
要求
- 您至少需要PHP 7.2
- 已安装Composer
- 如果您想使用数据库,MySQL是唯一支持的数据库(目前没有支持其他数据库的功能)
如果您想使用它,请从该存储库下载,然后在项目根目录的shell中,输入以下命令下载所有依赖项(fastRoute、whoops和monolog)
composer install
之后,在shell中,要验证/构建您项目的结构,只需输入
php thatsIt.php verify
此命令将创建启动项目所需的所有文件和文件夹。在此阶段,您可以转到src/Public,在那里您将看到index.php。此文件是应用程序的入口点。
现在,您可以使用以下命令启动PHP服务器
php -S localhost:8000
您的应用程序正在运行,如果您在浏览器中输入localhost:8000,您将看到一个简单的404页面。那么接下来该怎么办呢?
文件夹和文件结构
对您来说,重要的是config和src文件夹。
在config文件夹中,您将看到3个文件
- config.php(在这里您将指定服务器路径和当前环境)
- database.php(在这里您将放入访问数据库的所有信息)
- router.php(在这里您将告诉应用程序如何处理路由)
这些文件由框架创建,并已为您设置好以供使用。
在src文件夹中,您将找到
- 控制器文件夹(在这里您将编写您的控制器)
- 公共文件夹(在这里是您的入口点,以及您的外部可访问文件,如.js、.css和图像)
- 视图文件夹(在这里您将放置您的视图和模板)
只有视图和控制器
在这个框架中,控制器是接收请求、执行所有“重劳动”(如数据库请求等)的组件,而视图是接收数据并将其展示给用户的组件。
如果您像我一样,不喜欢ORM的“暗黑魔法”(即“懒加载”),那么您可以忘记它们,以及这个框架中的模型。
如果您想将业务逻辑与控制器分离,可以创建一个文件夹来放置这些内容。别忘了在项目的composer.json中添加此文件夹及其命名空间。
工作示例
路由
想象一下,您有这个config/router.php文件
<?php return [ "home" => [ "path" => "/{name}", "httpMethods" => ["GET", "POST"], // accept "GET", "POST", "PUT" and "DELETE" "controller" => "App\\Controller\\HomeController", "function" => "homeFunction", "parameters" => [ "name" => [ "default" => "Generic User" ], "age" => [ "default" => 18 ] ] ] ];
这意味着对于路径"/{name}",您将有一个名为"home"的路由,它可以响应GET和POST请求。处理这些请求的控制器和函数分别是"App\Controller\HomeController"和"homeFunction"。
此函数将接收参数$name和$age。
控制器
现在,控制器应该是这样的
<?php namespace App\Controller; use ThatsIt\Controller\AbstractController; use ThatsIt\Response\HttpResponse; use ThatsIt\Response\View; class HomeController extends AbstractController { function homeFunction(string $name, int $age): HttpResponse { // create View that will show the test view $view = new View("test"); // add $name to the view that will be available as $userName in the view $view->addVariable("userName", $name); // add $age to the view that will be available as $age in the view $view->addVariable("age", $age); return $view; } }
在这段代码中,您可以看到在您提供的config/router.php中控制器函数中接收了$name和$age变量。在函数内部,创建了一个名为"teste"的视图,并向该视图添加了两个变量。最后,必须返回一个HttpResponse。目前,只有View和JsonResponse类继承了HttpResponse。如果您愿意,也可以创建更多。
您应将此文件放置在src/Controller中,命名为HomeController.php。
在这段代码中,HomeController继承了AbstractController,但实际上并不需要这样做。但让所有控制器都继承AbstractController会更好,因为它将提供
- 访问数据库(使用$this->getPDO() - 更多关于PDO的信息,请参阅https://php.ac.cn/manual/en/book.pdo.php)
- 访问HttpRequest(使用$this->getRequest())
- 访问所有路由(使用$this->getRoutes())
- 访问日志记录器(使用$this->getLogger())
View
在您的视图中,您将编写HTML、CSS、JS,也可以使用PHP。例如
<html> <head> <style> /* css code */ </style> </head> <body> <div> <b>Home page</b> </div> <div> Hello To ThatsIt, <?php echo $userName; ?> </div> <div> You're <?php echo $age; ?> years old </div> <script> // js code </script> </body> </html>
我认为代码是自我解释的。您可以使用HTML编写您的视图,并使用PHP打印您的变量。当然,您将能够充分利用PHP。
您必须将此文件保存为src/View中的test.php。如果您想使用其他名称保存,则必须更改控制器中传递给View构造函数的参数。
您还可以将其保存在src/View/Other_folder中。如果是这样,您还必须在传递给View构造函数的参数中进行更改(例如"Other_folder/test")。
这就完了?
现在,如果您在src/Public中启动服务器
php -S localhost:8000
您可以在浏览器中访问localhost:8000/{在此处输入您的姓名}以查看代码的结果。如您所见,您的姓名显示在屏幕上。如果您想更改屏幕上显示的"age",可以访问
localhost:8000/{put your name here}?age={put your age here}
您的姓名仍然在那里,现在您的年龄也显示在那里。
这就完了。
我为什么做ThatsIt框架?
- 首先,我喜欢控制我的数据。所以我更愿意自己编写查询,而不是信任ORM及其通常做的所有懒加载。
- 其次,我一直认为PHP本身就是作为一个"独行侠"很棒。我只是不喜欢总是检查变量是否存在,或者它们的类型是什么(与$_GET和$_POST变量相关)
- 第三,我喜欢数据处理和显示部分之间的分离。所以我需要的只是控制器和视图
- 第四,这是了解框架背后基本原理的好练习(一个真正简单的框架)
注意:我要感谢Patrick Louys在GitHub上提供的HTTP库,我大量使用了它来制作自己的库,并进行了一些修正和调整,还要感谢他的无框架教程。尽管如此,ThatsIt框架并非基于这个教程,但它是一个很好的资源,可以学习已存在的优秀工具,并看到良好的原则。我推荐给任何想要了解框架“幕后”的人。