将支持自动装配的league/container作为Slim 3的核心容器使用

v1.0.2 2019-01-14 17:59 UTC

This package is auto-updated.

Last update: 2024-09-15 06:12:04 UTC


README

Latest Stable Version Build Status Coverage Status

Lean 允许您将带有自动装配支持的 PHP League's Container 包作为核心容器用于 Slim 3

安装

通过 Composer

$ composer require jenssegers/lean

用法

开始使用 Lean 的最简单方法是创建一个 Jenssegers\Lean\App 实例

require 'vendor/autoload.php';

$app = new \Jenssegers\Lean\App();

$app->get('/hello/{name}', function (Request $request, Response $response, string $name) {
    return $response->write('Hello, ' . $name);
});

$app->run();

在幕后,通过将所有必需的 Slim 组件添加到 League 的容器中,启动一个 Slim 应用程序。

服务提供者

服务提供者可以组织您的容器定义,并在大型应用程序中提高性能,因为服务提供者中注册的定义将在检索服务时惰性注册。

要构建服务提供者,只需扩展基本服务提供者并定义您想注册的内容即可。

use League\Container\ServiceProvider\AbstractServiceProvider;

class SomeServiceProvider extends AbstractServiceProvider
{
    /**
     * The provided array is a way to let the container
     * know that a service is provided by this service
     * provider. Every service that is registered via
     * this service provider must have an alias added
     * to this array or it will be ignored.
     */
    protected $provides = [
        SomeInterface::class,
    ];

    /**
     * This is where the magic happens, within the method you can
     * access the container and register or retrieve anything
     * that you need to, but remember, every alias registered
     * within this method must be declared in the `$provides` array.
     */
    public function register()
    {
        $this->getContainer()
            ->add(SomeInterface::class, SomeImplementation::class);
    }
}

要将此服务提供者注册到容器中,只需将您的提供者实例或完全限定类名传递给 League\Container\Container::addServiceProvider 方法。

$app = new \Jenssegers\Lean\App();
$app->getContainer()->addServiceProvider(\Acme\ServiceProvider\SomeServiceProvider::class);

有关服务提供者的更多信息,请参阅 此处

设置

您可以通过容器上的 settings 键访问 Slim 的内部配置

$app = new \Jenssegers\Lean\App();

$app->getContainer()->get('settings')['displayErrorDetails'] = true;

或者,注册了一个别名,允许更流畅地处理设置

$app = new \Jenssegers\Lean\App();

$app->getContainer()->get(\Slim\Settings::class)->set('displayErrorDetails', true);

有关可用配置选项的更多信息,请参阅 此处

路由参数

默认情况下,Lean 将使用方法注入将参数传递给您的路由。这允许您在方法级别对依赖项进行类型提示(类似于 Laravel 框架)。

路由参数将作为单个参数传递给您的函数

$app->get('/books/{id}', function (Request $request, Response $response, string $id) {
    ...
});

它们也可以通过 getAttribute 方法访问。

$app->get('/books/{id}', function (Request $request, Response $response) {
    $id = $request->getAttribute('id');
    ....
});

如果您想禁用此行为并使用 Slim 的默认路由参数方式,可以将 methodInjection 设置为 false 来禁用此功能

$app->getContainer()->get(\Slim\Settings::class)->set('methodInjection', false);

有关路由的更多信息,请参阅 此处

错误处理器

默认情况下,Lean 使用 Slim 的错误处理器。有几种不同的方式可以实现 Slim 的错误处理器,更多关于这些内容请参阅 此处

通常您会创建一个类似这样的自定义错误处理器类

class CustomErrorHandler
{
    public function __invoke(ServerRequestInterface $request, Response $response, Throwable $exception)
    {
        return $response->withJson([
            'error' => 'Something went wrong',
        ], 500);
    }
}

然后通过将其添加到容器中,覆盖默认处理器

$app = new Jenssegers\Lean\App();

$app->getContainer()->share('errorHandler', function () {
    return new CustomErrorHandler();
});

理想情况下,您应该将此代码放在服务提供者中。有关服务提供者的更多信息,请参阅上面。

测试

$ php ./vendor/bin/phpunit

许可证

MIT 许可证 (MIT)。