【问题标题】:Symfony dependency injection and your own servicesSymfony 依赖注入和你自己的服务
【发布时间】:2014-02-25 09:59:36
【问题描述】:

我正在尝试借助 symfony 依赖注入组件将我自己的类注册为服务,但是我在加载类时遇到了问题。

我的文件结构是这样的:

我的生成器类很简单

<?php

namespace Localhost\Service\String;

class Generator {

    private $iStringLength;

    public function __construct($iNewStringLength = 5) {
        $this->iStringLength = $iNewStringLength;
    }

    public function getRandomString() {
        $sChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $sRandChar = substr(str_shuffle(str_repeat($sChars,5)),0, $this->iStringLength);

        return $sRandChar;
    }
}

索引是

<?php

require_once 'vendor/autoload.php';

/*
spl_autoload_register(function ($sClass) {
    echo $sClass;
    require_once str_replace('\\', '/', $sClass) . '.php';
});
*/

use Localhost\Service\String\Generator;

/*
$oStringGenerator = new Generator(55);
echo $oStringGenerator->getRandomString();
*/

use Symfony\Component\DependencyInjection\ContainerBuilder;

$oContainer = new ContainerBuilder();
$oContainer
    ->register('generator', 'Generator')
    ->addArgument('15');

$oGeneratorService = $oContainer->get('generator');
echo $oGeneratorService->getRandomString();

我得到的是一个错误

Fatal error: Uncaught exception 'ReflectionException' with message 'Class Generator does not exist' in D:\Localhost\Apache\htdocs\Test\vendor\symfony\dependency-injection\Symfony\Component\DependencyInjection\ContainerBuilder.php:959 Stack trace: #0 D:\Localhost\Apache\htdocs\Test\vendor\symfony\dependency-injection\Symfony\Component\DependencyInjection\ContainerBuilder.php(959): ReflectionClass->__construct('Generator') #1 D:\Localhost\Apache\htdocs\Test\vendor\symfony\dependency-injection\Symfony\Component\DependencyInjection\ContainerBuilder.php(493): Symfony\Component\DependencyInjection\ContainerBuilder->createService(Object(Symfony\Component\DependencyInjection\Definition), 'generator') #2 D:\Localhost\Apache\htdocs\Test\index.php(26): Symfony\Component\DependencyInjection\ContainerBuilder->get('generator') #3 {main} thrown in D:\Localhost\Apache\htdocs\Test\vendor\symfony\dependency-injection\Symfony\Component\DependencyInjection\ContainerBuilder.php on line 959

或者作为图片

【问题讨论】:

  • 这是 symfony2 项目?或者你只想使用 DependencyInjection 组件?
  • 仅依赖注入组件

标签: php symfony dependency-injection


【解决方案1】:

编辑:自 Symfony 3.3+(2017 年 5 月)您可以使用 register() 类名服务快捷方式:

$containerBuilder = new ContainerBuilder();
$containerBuilder->register(Localhost\Service\String\Generator::class)
    ->addArgument('15');

自 PHP 5.5+ 起,您可以使用更多的防故障::class 表示法:

$containerBuilder = new ContainerBuilder();
$containerBuilder->register('generator', Localhost\Service\String\Generator::class)
    ->addArgument('15');

现在,当类名输入错误时,您的 IDE 会突出显示它。

【讨论】:

    【解决方案2】:
    $oContainer = new ContainerBuilder();
    $oContainer
        ->register('generator', 'Localhost\Service\String\Generator')
        ->addArgument('15');
    

    【讨论】:

      【解决方案3】:

      解决方法很简单,我忘了修改 composer config 来加载我的服务

      "autoload": {
          "psr-0": {"Localhost": "src/"}
      },
      

      【讨论】:

        【解决方案4】:

        加法

        出于性能原因,您可能应该 compile 容器。

        $container = new ContainerBuilder();
        $container
            ->register('generator', 'Localhost\Service\String\Generator')
            ->addArgument('15')
        ;
        $container->compile();
        

        【讨论】:

        • 现在它会生成致命的“致命错误:找不到类'Symfony\Component\Config\Resource\FileResource'”:) 但可以理解,我没有包含配置组件。
        • 哦,这很奇怪。我认为如果没有安装symfony/config,它可能应该抛出一个更具描述性的异常。
        猜你喜欢
        • 2017-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 2019-01-05
        相关资源
        最近更新 更多