tisuit/core

此包已被弃用且不再维护。作者建议使用 wtf/core 包。

TiSuit 的核心包

1.0.0 2017-11-28 13:32 UTC

This package is not auto-updated.

Last update: 2018-02-22 15:11:22 UTC


README

Build Status Coverage Status SensioLabsInsight Latest Stable Version Latest Unstable Version Total Downloads Monthly Downloads composer.lock available License

注意:TiSuit 是 Slim 框架的包装器,它本身不是一个框架!

目录

这是啥?

概念

作为网页开发者,你需要为你的应用编写一些基础设施代码。例如:依赖管理器、路由器、DI 容器等等。

我们也需要这样的工具。这就是我们创建 TiSuit 的原因。

主要思想很简单:我们已经实现了大量的基础设施逻辑(配置解析器、“魔法系统父类”等等),我们只需要将其打包成单独的包,以便在其他项目中使用,而无需复制粘贴。

基本要求

  1. 我们需要一个简单的 HTTP 请求/响应处理器
  2. 我们需要一个好的 DI 容器
  3. 我们懒得自己实现它
  4. Slim、Laravel 等框架对我们来说太大,且有很多缺点。

好的,Slim 框架是我们的(好)选择!

实际需求

  1. 嗯,Slim 确实很好,但我们需要一些方便的配置管理工具。结果:从 PHPixie 2.x 中采用的 Config 类。谢谢,@dracony :)
  2. 嗯,但我们想要魔法!我们不想每次都调用 $app->getContainer()->get('something'),这太长了。结果是来自 rakshazi/slim-suit(TiSuit 的“祖父”)的 Root 类。
  3. 嗯... 好的,但我真的需要扩展父类 Root。欢迎,Pimple 提供者。
  4. 最后一步:舒适的 DI 配置(slim 的 dependencies.php 太丑陋且无法使用)。欢迎 Provider 类,感谢,Pimple

结论

我们构建了一个非常灵活的解决方案,允许你创建应用的业务逻辑,无需担心基础设施代码(注意:100% 测试覆盖率)。

还有一件事:tisuit/core 包只是主要组件。你可以像使用 slim 框架本身一样使用它,但使用 TiSuit,你将拥有所有这些魔法(实际上非常简单且可预测。它不像 Java 中的 Spring 那样。),以及易于使用的类,与 Slim 框架本身完全兼容。

如何开始?

只需使用Slim "Hello world"。

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require 'vendor/autoload.php';

$app = new \TiSuit\Core\App;
$app->get('/hello/{name}', function (Request $request, Response $response) {
    $name = $request->getAttribute('name');
    $response->getBody()->write("Hello, $name");

    return $response;
});
$app->run();

如何使用魔法?

您需要在App构造函数中传递您配置文件夹的路径(如Slim设置,见:https://slim.php.ac.cn/docs/objects/application.html#application-configuration),示例


$config = [
    'config_dir' => __DIR__.'/config',
    'settings' => [
        'displayErrorDetails' => true,

        'logger' => [
            'name' => 'slim-app',
            'level' => Monolog\Logger::DEBUG,
            'path' => __DIR__ . '/../logs/app.log',
        ],
    ],
];
$app = new \TiSuit\Core\App($config);

现在,魔法!

$root = new \TiSuit\Core\Root($app->getContainer());
echo $root->config('app.site.name', 'production');

将文件 app.php 放在 __DIR__.'/config' 文件夹中(您在App构造函数中传递了它,记得吗?)

<?php return [
    'site' => [
        'name' => 'TiSuit Example',
        'url' => 'https://example.com',
        'parent' => 'https://slimframework.com',
    ],
];

以此类推 :)

更多详细文档即将推出。

核心包不够!我想更多!

好的,没问题!只需打开TiSuit仓库列表并选择任何其他包。

顺便说一下,TiSuit架构就像乐高积木。您只需要主"平台"和核心包,需要更多功能?在您的composer.json中添加其他包,然后享受快乐 :)

每个类的文档

App

它只是围绕\Slim\App添加一些魔法和自动加载的包装。

配置目录

因为我们有在tisuit/core中的Config类,我们需要告诉它,在哪里获取配置。这就是为什么当你创建应用程序实例($app = new \TiSuit\Core\App($config))时,你可能需要将config_dir作为$config数组中的键传递。事实上,你只需要传递那个键!因为应用程序构建阶段,Config类将尝试加载包含Slim框架和TiSuit所有配置的suit配置文件。

如果您不传递它,默认使用的值将是getcwd().'/config'

Suit配置文件

suit.php是起点。在这里,您可以定义自动加载的中间件列表,必需提供者列表,Slim框架设置等等。让我们看看例子

<?php

declare(strict_types=1);

return [
    'providers' => [
        '\App\Provider', // You can define list of required service providers here. @see https://pimple.symfony.com/#extending-a-container
    ],
    'middlewares' => [
        'example_middleware',  // You can define list of autoloaded middlewares here. NOTE: each middleware MUST be defined in any loaded Provider class.
    ],
    'sentry' => [ // We have deep integration with sentry.io (and self-hosted, too) @see https://docs.sentry.io
        'dsn' => 'https://fa38d114872b4533834f0ffd53e59ddc:54ffe4da5b23455da1b93d4b6abc246e@sentry.io/211424', //demo project
        'options' => [],
    ],
    'settings' => [ // Slim framework settings @see https://slim.php.ac.cn/docs/objects/application.html#application-configuration
        'displayErrorDetails' => true,
        'determineRouteBeforeAppMiddleware' => true,
        'debug' => true,
    ],
];

应用程序 - 级别路由器

如果您不想在index.php文件中使用闭包定义路由(Slim框架的选择:(),您可以创建应用程序级别的路由器类,该类将处理路由,让我们创建一个(例如)。

在您的提供者中定义它

您必须使用键app_router来定义该类,例如这样

$container['app_router'] = function ($c) {
    return new \YourApp\Router($c);
};

创建路由列表

注意:这只是示例,您可以做所有想做的事情

例如,配置目录中的routes.php

<?php
return [
    //Not good idea, MVC is the best :)
    '/' => function ($request, $response, $args) {
            return $response->write('Hello world!');
    },
];

创建路由器类

<?php
namespace YourApp;

class Router extends \TiSuit\Core\Root
{
    // This class will be called via __invoke method
    public function __invoke(\Slim\App $app)
    {
        foreach($this->config('routes') as $pattern => $closure) {
            $app->any($pattern, $closure);
        }
    }
}

这就是全部!尝试在浏览器中打开/并看到Hello world! :)

提供者

每个tisuit包都将为其提供自己的提供者。它就像Symfony bundlers,但更简单,更不复杂:)

提供者文档可以在这里找到:https://pimple.symfony.com/#extending-a-container

您可以在suit.php配置文件(providers数组)中添加许多提供者,只需添加一行带有所需提供者类名的行,它将自动加载

PS:核心有自己的提供者,但它是在应用程序提供者之前加载的

配置

如前所述,ConfigPHPixie 2.x 采纳的类,主要思想是提供一种简单的方式来处理配置。

Config 必须通过 __invoke() 方法调用(例如 $config('suit.settings')),但请随意使用任何其他公共方法,它们都有很好的文档(希望如此..)

在您的应用程序中,您将从 Root 子类中调用它,大多数情况下:$this->config('suit.settings')

配置字符串必须由点分隔。第一个单词(第一个点之前)是文件名,所有其他的是该文件中的键。

注意:配置不仅可以返回值,还可以返回组。如果您调用配置并希望接收整个文件或任何嵌套集合的数组,只需传递类似 suit(以接收整个文件的内容)或 suit.settings(以接收精简设置的数组)的内容。

Root

魔法。这就是全部 :)

这个类允许您从容器中调用函数,使用魔法获取器和设置器等等。如果您想扩展根应用程序类,您必须使用这个类作为父类