1

我正在学习 Auraphp Di,我想编写示例代码。假设我有这些文件:

公共/index.php:

use Aura\Di\ContainerBuilder;
use MyPackage\Component\Authentication\AuthenticateFlow;

require_once dirname(__DIR__) . '/vendor/autoload.php';

$builder = new ContainerBuilder();
$di = $builder->newInstance();

$di->set('authenticateFlow', $di->lazyNew(AuthenticateFlow::class));

$authenticateFlow = $di->get('authenticateFlow');

$authenticateFlow->showName('Belkin');

/src/Components/Authentication/AuthenticationFlow.php:

namespace MyPackage\Components\Authentication;

class AuthenticationFlow
{
    public function showName($name)
    {
        echo $name;
    }
}

这工作正常。现在假设我有另一个类(/src/Components/Authentication/Filter.php),它有一个名为 filterInput 的方法:

namespace MyPackage\Components\Authentication;

class Filter
{
    public function filterInput($input)
    {
        return htmlspecialchars($input);
    }
}

如何将过滤器注入 AuthenticationFlow,以使用 filterInput() 方法?我想在 AuthenticationFlow::showName() 中有这样的东西:

echo $this->filter->filterInput($name);

我知道我需要在 AuthenticationFlow 构造函数中注入 Filter 类,但我不知道是否可以使用 index.php 中构建的容器。如果我需要在 AuthenticationFlow 中创建另一个容器,index.php 将如何知道它?

4

1 回答 1

2

您的应用程序需要大量使用 di 容器才能注入必要的依赖项。这不是 Aura 的情况。

让我们退后一步,看看如果你不使用容器你会做什么。

为了使用Filterobject inside AuthenticationFlow,您需要Filter通过构造函数或 setter 方法注入对象。在下面的示例中,我正在使用构造函数注入。

class AuthenticationFlow
{
    protected $filter;

    public function __construct(Filter $filter)
    {
        $this->filter = $filter;
    }

    public function showName($name)
    {
        return $this->filter->filterInput($name);
    }
}

所以你将创建一个AuthenticationFlow如下的对象。

$auth = new AuthenticationFlow(new Filter);

在 Aura.Di 的情况下,您可以执行类似的操作

$object = $di->newInstance(AuthenticateFlow::class);

如果关闭了自动解析,则需要定义如下依赖项

$di->params[AuthenticateFlow::class]['filter'] = $di->lazyNew(Filter::class);

在应用程序中,这不是真的。您可能需要AuthenticateFlow不同的HelloController::class.

Class HelloController
{
    protected $auth;

    public function __construct(AuthenticationFlow $auth)
    {
        $this->auth = $auth;
    }

    public function execute()
    {
        // Do something 
    }
}

所以在那种情况下,HelloController::class需要通过 di 本身来实例化。否则将不会自动注入依赖项。

$object = $di->newInstance(HelloController::class);

您可以在多个类中扩展Aura\Di\ContainerConfig定义服务。

例子 :

namespace YourVendor;

use Aura\Di\Container;
use Aura\Di\ContainerConfig;
class Config extends ContainerConfig
{
    public function define(Container $di)
    {
        $di->set(HelloController::class, $di->lazyNew(HelloController::class));
        $di->params[HelloController::class]['auth'] = $di->lazyNew(AuthenticateFlow::class);
        $di->params[AuthenticateFlow::class]['filter'] = $di->lazyNew(Filter::class);
    }

    public function modify(Container $di)
    {
        // You can get the service and modify if needed
        // $auth = $di->get('authenticateFlow');
    }
}

现在你的 index.php 看起来像,

require_once dirname(__DIR__) . '/vendor/autoload.php';

$builder = new ContainerBuilder();
$di = $container_builder->newConfiguredInstance([
    'YourVendor\Config',    
]);

$hello = $di->newInstance(HelloController::class);
$hello->execute();

正如我在上一个答案中提到的,我建议您先阅读文档。从长远来看,它真的会帮助你。

于 2019-12-12T06:19:15.470 回答