我是否需要在 class 中定义一个容器来进行依赖注入?
Do I need to define a container inside a class for dependency injection?
我正在学习Auraphp Di,我想写示例代码。假设我有这些文件:
public/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;
}
}
这工作正常。现在假设我有另一个 class (/src/Components/Authentication/Filter.php),它有一个名为 filterInput:
的方法
namespace MyPackage\Components\Authentication;
class Filter
{
public function filterInput($input)
{
return htmlspecialchars($input);
}
}
如何将 Filter 注入 AuthenticationFlow,以使用 filterInput() 方法?我想在 AuthenticationFlow::showName():
中有这样的东西
echo $this->filter->filterInput($name);
我知道我需要在 AuthenticationFlow 构造函数中注入 Filter class,但我不知道我是否可以使用 index.php 中内置的容器。
如果我需要在 AuthenticationFlow 中创建另一个容器,index.php 如何知道它?
您的应用程序需要大量使用 di 容器,以便注入必要的依赖项。这不是Aura的情况。
让我们退后一步,看看如果不使用容器,您会做什么。
为了在 AuthenticationFlow
中使用 Filter
对象,您需要通过构造函数或 setter 方法注入 Filter
对象。在下面的示例中,我正在使用构造函数注入。
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);
If auto resolution is turned off, you need to define dependencies as below
$di->params[AuthenticateFlow::class]['filter'] = $di->lazyNew(Filter::class);
这在应用程序中是不正确的。您可能需要在另一个 HelloController::class
上使用 AuthenticateFlow
。
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
和 define services。
示例:
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();
正如我在之前的回答中提到的,我建议您先阅读文档。它会真正帮助你 运行.
我正在学习Auraphp Di,我想写示例代码。假设我有这些文件:
public/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;
}
}
这工作正常。现在假设我有另一个 class (/src/Components/Authentication/Filter.php),它有一个名为 filterInput:
的方法namespace MyPackage\Components\Authentication;
class Filter
{
public function filterInput($input)
{
return htmlspecialchars($input);
}
}
如何将 Filter 注入 AuthenticationFlow,以使用 filterInput() 方法?我想在 AuthenticationFlow::showName():
中有这样的东西echo $this->filter->filterInput($name);
我知道我需要在 AuthenticationFlow 构造函数中注入 Filter class,但我不知道我是否可以使用 index.php 中内置的容器。 如果我需要在 AuthenticationFlow 中创建另一个容器,index.php 如何知道它?
您的应用程序需要大量使用 di 容器,以便注入必要的依赖项。这不是Aura的情况。
让我们退后一步,看看如果不使用容器,您会做什么。
为了在 AuthenticationFlow
中使用 Filter
对象,您需要通过构造函数或 setter 方法注入 Filter
对象。在下面的示例中,我正在使用构造函数注入。
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);
If auto resolution is turned off, you need to define dependencies as below
$di->params[AuthenticateFlow::class]['filter'] = $di->lazyNew(Filter::class);
这在应用程序中是不正确的。您可能需要在另一个 HelloController::class
上使用 AuthenticateFlow
。
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
和 define services。
示例:
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();
正如我在之前的回答中提到的,我建议您先阅读文档。它会真正帮助你 运行.