标签: php-di

PHP DI - 无法解析 __construct() 的参数 $logger 没有定义或可猜测的值

我正在尝试获取 PHP-DI 工作的基本示例,但我很容易陷入一个相当基本的示例。我想我在这里遗漏了一些简单的东西,但一直没能把它挑出来。

它无法识别 LoggerInterface 类型提示,但这是直接从示例中提取的,所以我不明白我做错了什么。

当我从服务签名中删除 LoggerInterface 时,该示例工作正常。

服务等级:

<?php
namespace test\ServiceLayer;
class TestService extends BaseService{
  public function __construct(\Psr\Log\LoggerInterface $logger){}
}
?>
Run Code Online (Sandbox Code Playgroud)

配置文件

<?php
use Monolog\Logger;
return [
    'TestService' => \DI\create(\test\ServiceLayer\TestService::class),
    Psr\Log\LoggerInterface::class => DI\factory(function () {
        $logger = new Logger('mylog');
        return $logger;
    }),
];
?>
Run Code Online (Sandbox Code Playgroud)

用法:

<?php
$builder = new \DI\ContainerBuilder();
$builder->addDefinitions('config.php');
$container = $builder->build();
$service = $container->get('TestService');
?>
Run Code Online (Sandbox Code Playgroud)

例外:

object(DI\Definition\Exception\InvalidDefinition)#115 (7) {
["message":protected]=> string(196) "Entry "TestService" cannot beresolution: __construct() 的参数 $logger 没有定义值或可猜测的完整定义:对象(类 = arkon\ServiceLayer\TestService lazy = false)”

php php-di

4
推荐指数
1
解决办法
1814
查看次数

如何在 slim 4 中设置和注入多个 PDO 数据库连接?

我可以创建一个实例PDO并成功注入它。我PDO::class直接定义了并将其注入到构造函数中__construct(PDO $pdo)。我需要类似的东西PDO1::class并按PDO2::class如下方式注入它:__construct(PDO1 $pdo1, PDO2 $pdo2)但这显然不起作用。只有一个PDO类,我需要做的是它的 2 个具有不同数据库凭据的实例。
最好的方法是什么?

我通过这样的 PDO 设置了一个数据库定义,它可以工作:

文件: dependencies.php

use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;

return function (ContainerBuilder $containerBuilder) {
    $containerBuilder->addDefinitions([
        PDO::class => function (ContainerInterface $c) {
            $dbSettings = $c->get('settings')['db1'];
            $dsn = 'mysql:host=' . $dbSettings['host'] . ';dbname=' . $dbSettings['dbname'];
            $options = [
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                PDO::ATTR_EMULATE_PREPARES => false,
            ];
            return new PDO($dsn, $dbSettings['user'], $dbSettings['pass'], $options);
        },
    ]);
};
Run Code Online (Sandbox Code Playgroud)

文件: index.php

... …
Run Code Online (Sandbox Code Playgroud)

php pdo slim php-di slim-4

4
推荐指数
1
解决办法
2466
查看次数

如何使用 Slim-Skeleton 中演示的 PHP-DI 设置访问 slim4 的routeParser?

我已经基于 SlimPHP 团队的Slim Skeleton应用程序设置了一个新应用程序。在我的路由定义中,我希望能够访问Slim4 文档 中所述的路由解析器。因此,例如,我希望能够编辑骨架的app/routes.php文件,如下所示:

    $app->get('/', function (Request $request, Response $response) {
        $routeParser = $app->getRouteCollector()->getRouteParser();  // this doesn't work
        $response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
        return $response;
    });
Run Code Online (Sandbox Code Playgroud)

这是有道理的,但$app->getRouteCollector()->getRouteParser()不起作用,因为$app这里没有定义。但我认为我们应该调用$this->getRouteCollector()->getRouteParser();,但这会给出错误:"Call to undefined method DI\\Container::getRouteCollector()"

看来我的困惑显然​​是关于依赖注入,这对我来说是新的,而且对我来说并不自然。老实说,我很想在其他地方定义 $routeParser 变量(在 index.php 内?),这样我就可以在任何路由定义中访问它,而不必每次都调用 $app->getRouteCollector()->getRouteParser() 。但目前我会满足于任何有效的方法。

php slim php-di slim-4

3
推荐指数
1
解决办法
1766
查看次数

如何获取 PHP DI 容器?

如何使用PHP DI加载数据库容器?这是我迄今为止尝试过的变体之一。

设置.php

<?php 
use MyApp\Core\Database;
use MyApp\Models\SystemUser;

return [
    'Database'      => new Database(), 
    'SystemUser'    => new SystemUser()
];
Run Code Online (Sandbox Code Playgroud)

初始化文件

$containerBuilder   = new \DI\ContainerBuilder(); 
$containerBuilder->addDefinitions('Settings.php');
$container          = $containerBuilder->build();
Run Code Online (Sandbox Code Playgroud)

系统用户详细信息.php

<?php 
namespace MyApp\Models\SystemUser;

use MyApp\Core\Database;
use MyApp\Core\Config;
use MyApp\Helpers\Session;


/**
 *
 *  System User Details Class
 *
 */
class SystemUserDetails 
{

/*=================================
=            Variables            =
=================================*/

    private $db;


/*===============================
=            Methods            =
================================*/

    /**
     *
     *  Construct
     *
     */
    public function __construct(Database $db)
    {
        # Get database instance
        // …
Run Code Online (Sandbox Code Playgroud)

php oop containers dependency-injection php-di

0
推荐指数
1
解决办法
1199
查看次数

标签 统计

php ×4

php-di ×4

slim ×2

slim-4 ×2

containers ×1

dependency-injection ×1

oop ×1

pdo ×1