tisuit / core
Requires
- php: ^7.1
- sentry/sentry: ^1
- slim/slim: ^3
README
注意:TiSuit 是 Slim 框架的包装器,它本身不是一个框架!
目录
这是啥?
概念
作为网页开发者,你需要为你的应用编写一些基础设施代码。例如:依赖管理器、路由器、DI 容器等等。
我们也需要这样的工具。这就是我们创建 TiSuit 的原因。
主要思想很简单:我们已经实现了大量的基础设施逻辑(配置解析器、“魔法系统父类”等等),我们只需要将其打包成单独的包,以便在其他项目中使用,而无需复制粘贴。
基本要求
- 我们需要一个简单的 HTTP 请求/响应处理器
- 我们需要一个好的 DI 容器
- 我们懒得自己实现它
- Slim、Laravel 等框架对我们来说太大,且有很多缺点。
好的,Slim 框架是我们的(好)选择!
实际需求
- 嗯,Slim 确实很好,但我们需要一些方便的配置管理工具。结果:从 PHPixie 2.x 中采用的
Config
类。谢谢,@dracony :) - 嗯,但我们想要魔法!我们不想每次都调用
$app->getContainer()->get('something')
,这太长了。结果是来自 rakshazi/slim-suit(TiSuit 的“祖父”)的Root
类。 - 嗯... 好的,但我真的需要扩展父类
Root
。欢迎,Pimple 提供者。 - 最后一步:舒适的 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:核心有自己的提供者,但它是在应用程序提供者之前加载的
配置
如前所述,Config
是 PHPixie 2.x
采纳的类,主要思想是提供一种简单的方式来处理配置。
Config
必须通过 __invoke()
方法调用(例如 $config('suit.settings')
),但请随意使用任何其他公共方法,它们都有很好的文档(希望如此..)
在您的应用程序中,您将从 Root
子类中调用它,大多数情况下:$this->config('suit.settings')
配置字符串必须由点分隔。第一个单词(第一个点之前)是文件名,所有其他的是该文件中的键。
注意:配置不仅可以返回值,还可以返回组。如果您调用配置并希望接收整个文件或任何嵌套集合的数组,只需传递类似
suit
(以接收整个文件的内容)或suit.settings
(以接收精简设置的数组)的内容。
Root
魔法。这就是全部 :)
这个类允许您从容器中调用函数,使用魔法获取器和设置器等等。如果您想扩展根应用程序类,您必须使用这个类作为父类