2014-02-25 41 views
1

我想註冊我自己的類作爲服務與symfony依賴注入組件幫助,但我有類加載的問題。Symfony依賴注入和你自己的服務

我的文件結構如下:

enter image description here

我生成類很簡單

<?php 

namespace Localhost\Service\String; 

class Generator { 

    private $iStringLength; 

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

    public function getRandomString() { 
     $sChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
     $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 

或者作爲一個圖片

enter image description here

+1

這是symfony2項目嗎?或者你想只使用DependencyInjection組件? – NHG

+0

只有DependencyInjection組件 – MyMomSaysIamSpecial

回答

2
$oContainer = new ContainerBuilder(); 
$oContainer 
    ->register('generator', 'Localhost\Service\String\Generator') 
    ->addArgument('15'); 
+0

你是對的 - 應該是fqcn :) – nifr

2

解決方法很簡單,我忘了修改作曲家配置加載我的服務

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

此外

你想必應該由於性能原因,容器爲compile

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

現在它生成致命的「致命錯誤:Class'Symfony \ Component \ Config \ Resource \ FileResource'找不到」:)但它可以理解,我沒有包含配置組件。 – MyMomSaysIamSpecial

+1

哦,這很奇怪。我認爲它可能會拋出一個更具描述性的異常,以防未安裝'symfony/config'。 – nifr

1

編輯:由於Symfony的3.3+(2017年五月),可以使用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會突出顯示它。