akrfjmt/slim-beauty

Slim3 的依赖注入器

v0.0.1 2019-03-05 08:38 UTC

This package is auto-updated.

Last update: 2024-09-06 09:48:07 UTC


README

slim3 的依赖注入器

设置

dependency.php 设置如下

<?php
use Akrfjmt\SlimBeauty\CustomCallableResolver;
use Akrfjmt\SlimBeauty\ParameterResolver;
use Akrfjmt\SlimBeauty\RequestResponseAutoParams;

$c = $app->getContainer();

// parameter resolver
$c[ParameterResolver::class] = function () use ($c) {
    return new ParameterResolver($c);
};

// customize foundHandler
$c['foundHandler'] = function() use ($c) {
    return new RequestResponseAutoParams($c->get(ParameterResolver::class), $c);
};

// customize callableResolver
$c['callableResolver'] = function() use ($c) {
    return new CustomCallableResolver($c, $c->get(ParameterResolver::class));
};

向Controller注入依赖组件

通过类型或参数名从容器中获取实例,并将其注入到Controller的参数中。
如果容器中不存在实例,将创建组件。
此时,将通过构造函数的类型或参数名递归地注入依赖组件。
新创建的实例将以其类名为键存储在容器中。

<?php
class UserController
{
    /** @var CustomPhpRenderer */
    public $renderer;

    public function __construct(CustomPhpRenderer $renderer)
    {
        $this->renderer = $renderer;
    }

    public function showUser(Request $request, Response $response, array $args, UserService $userService)
    {
        $user = $userService->getUser($args['id']);
        return $this->renderer->render($response, 'index.phtml', ['username' => $user->getName()]);
    }
}

在routes.php中定义Routes

<?php
$app->get('/@{name}', [UserController::class, 'showUser'])->setName('show_user');

可以使用如[UserController::class, 'showUser']的形式来编写routes定义。
这种格式的一个优点是可以在IntelliJ中跳转到定义源。