simplemvc / framework
SimpleMVC 框架
Requires
- php: ^7.4 || ^8.0
- nikic/fast-route: ^1.3
- nyholm/psr7: ^1.5
- nyholm/psr7-server: ^1.0
- psr/container: ^1.0 || ^2.0
- psr/http-client: ^1.0
- psr/log: ^1|^2|^3
Requires (Dev)
- mockery/mockery: ^1.5
- phpstan/phpstan: ^1.8
- phpstan/phpstan-mockery: ^1.1
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-08-29 06:02:00 UTC
README
SimpleMVC 是一个基于 MVC 架构模式,遵循 KISS 原则的 PHP 框架。
"保持简单,傻瓜式"(Keep It Simple, Stupid)
本项目旨在提供一个简单易用且快速的框架,用于开发遵循 PSR 标准的 PHP 应用程序。
SimpleMVC 使用依赖注入模式管理类之间的依赖关系,并使用 FastRoute 库实现路由系统。
SimpleMVC 使用以下 PHP-FIG 创新项目(PHP-FIG)的标准
本项目最初是作为意大利 ITS ICT Piemonte 举办的 Enrico Zimuel 的《PHP 编程》课程的教材。
自那时起,该项目已不断发展,并用于生产环境中构建 Web 应用程序。我们决定创建一个更通用的项目,这便是这个仓库的起源。
介绍
SimpleMVC 通过依赖注入和 PSR 标准实现了 Model–View–Controller (MVC) 架构模式。
一个 SimpleMVC 应用程序看起来如下所示
chdir(dirname(__DIR__)); require 'vendor/autoload.php'; use DI\ContainerBuilder; use SimpleMVC\App; use SimpleMVC\Emitter\SapiEmitter; $builder = new ContainerBuilder(); $builder->addDefinitions('config/container.php'); $container = $builder->build(); $app = new App($container); $app->bootstrap(); // optional $response = $app->dispatch(); // PSR-7 response SapiEmitter::emit($response);
在这个例子中,我们使用 PHP-DI 创建了一个 DI 容器,并使用该容器创建了一个 SimpleMVC\App
对象。
应用程序可以通过 config/container.php
文件进行配置。以下是一个示例
// config/container.php use App\Controller; return [ 'config' => [ 'routing' => [ 'routes' => [ [ 'GET', '/', Controller\HomePage::class ] ] ] ] ];
管理请求的步骤如下
bootstrap()
(可选),在这里可以指定任何引导需求;dispatch()
,在这里将 HTTP 请求分发到路由中指定的控制器;
dispatch()
返回一个 PSR-7 响应。最后,我们可以使用一个发射器渲染响应。在这个例子中,我们使用了 SapiEmitter
将 PSR-7 响应渲染到标准输出。
前面的 PHP 脚本基本上是一个 MVC 应用程序的前端控制器(见下面的图示)。
在这个图中,前端控制器存储在 public/index.php
文件中。通常,public
文件夹是 Web 服务器的文档根。
使用控制器管道
如果您愿意,可以为特定的路由指定要执行的控制器管道。例如,假设您有一个如下所示的路由
// config/container.php use App\Controller; use SimpleMVC\Controller\BasicAuth; return [ 'config' => [ 'routing' => [ 'routes' => [ [ 'GET', '/admin', [BasicAuth::class, Controller\HomePage::class ] ] ], 'authentication' => [ 'username' => 'admin', 'password' => '1234567890' ] ] ];
该路由 GET /admin
将首先执行 BasicAuth
控制器,如果身份验证成功,然后执行 HomePage
控制器。
这是一个按顺序执行的控制器管道。BasicAuth
是基本访问认证的简单实现。该控制器使用 authentication
部分的 username
和 password
配置。
如果认证不成功,BasicAuth
会发出一个 HaltResponse
,这将停止管道执行。HaltResponse
是一个特殊的 PSR-7,它通知 SimpleMVC 框架停止执行。
控制器间传递属性
如果在执行管道中需要从一个控制器传递一个属性(参数)到另一个控制器,可以使用 AttributeInterface
。例如,假设要从控制器 A
将 foo
属性传递到控制器 B
,可以使用以下路由管道
// config/container.php use App\Controller; return [ 'config' => [ 'routing' => [ 'routes' => [ [ 'GET', '/', [Controller\A::class, Controller\B::class ] ] ] ] ];
您需要创建以下控制器 A
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use SimpleMVC\Controller\AttributeInterface; use SimpleMVC\Controller\AttributeTrait; use SimpleMVC\Controller\ControllerInterface; class A implements ControllerInterface, AttributeInterface { use AttributeTrait; public function execute( ServerRequestInterface $request, ResponseInterface $response ): ResponseInterface { $this->addRequestAttribute('foo', 'bar'); return $response; } }
我们可以使用实现了 AttributeInterface
的 AttributeTrait
,它具有 addRequestAttribute(string $name, $value)
方法。此函数将 PSR-7 属性添加到 $request
中,以便传递给下一个控制器。
要在控制器 B
中获取 foo
参数,您可以使用 PSR-7 标准函数 getAttribute()
从 HTTP 请求中获取,如下所示
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use SimpleMVC\Controller\ControllerInterface; class B implements ControllerInterface { public function execute( ServerRequestInterface $request, ResponseInterface $response ): ResponseInterface { $attribute = $request->getAttribute('foo'); pritnf("Attribute is: %s", $attribute); return $response; } }
请注意,您不需要为控制器 B
实现 AttributeInterface
,因为我们只需要从 $request
中读取。
快速入门
您可以使用 skeleton 应用程序开始使用框架。
版权
本软件的作者是 Enrico Zimuel 以及其他 贡献者。
本软件在 MIT 许可证 下发布。