simplemvc/framework

SimpleMVC 框架

0.3.0 2022-09-13 20:40 UTC

This package is auto-updated.

Last update: 2024-08-29 06:02:00 UTC


README

Build status

SimpleMVC 是一个基于 MVC 架构模式,遵循 KISS 原则的 PHP 框架。

"保持简单,傻瓜式"(Keep It Simple, Stupid)

本项目旨在提供一个简单易用且快速的框架,用于开发遵循 PSR 标准的 PHP 应用程序。

SimpleMVC 使用依赖注入模式管理类之间的依赖关系,并使用 FastRoute 库实现路由系统。

SimpleMVC 使用以下 PHP-FIG 创新项目(PHP-FIG)的标准

  • PSR-11 用于 DI 容器;
  • PSR-7 用于 HTTP 消息;
  • PSR-3 用于日志记录;

本项目最初是作为意大利 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 应用程序的前端控制器(见下面的图示)。

MVC diagram

在这个图中,前端控制器存储在 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 部分的 usernamepassword 配置。

如果认证不成功,BasicAuth 会发出一个 HaltResponse,这将停止管道执行。HaltResponse 是一个特殊的 PSR-7,它通知 SimpleMVC 框架停止执行。

控制器间传递属性

如果在执行管道中需要从一个控制器传递一个属性(参数)到另一个控制器,可以使用 AttributeInterface。例如,假设要从控制器 Afoo 属性传递到控制器 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;
    }
}

我们可以使用实现了 AttributeInterfaceAttributeTrait,它具有 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 许可证 下发布。