2017-10-04 62 views
0

我開始與Symfony的服務工作,並因此創造了從symfony的文檔,示例服務:Symfony的現有公共服務引發的錯誤消息「您請求一個不存在的服務」

namespace AppBundle\Service; 

use Psr\Log\LoggerInterface; 

class MessageGenerator 
{ 
    private $logger; 
    public function __construct(LoggerInterface $logger){ 

    } 
    public function getMessage() 
    { 
     $this->logger->info('Success!'); 
    } 
} 

我稱之爲在我的控制器服務(我也有使用說明: :use AppBundle\Service\MessageGenerator;

$messageGenerator = $this->get(MessageGenerator::class); 
    $message = $messageGenerator->getMessage(); 
    $this->addFlash('success', $message); 

我的服務就是在services.yml文件中定義:

app.message_generator: 
    class: AppBundle\Service\MessageGenerator 
    public: true 

所以在我的眼裏,我做了完全一樣的文檔中描述的一切,打電話時:

php app/console debug:container app.message_generator 
在我的命令行

我讓我的服務:

Option    Value        
------------------ ------------------------------------ 
    Service ID   app.message_generator    
    Class    AppBundle\Service\MessageGenerator 
    Tags    -         
    Scope    container       
    Public    yes         
    Synthetic   no         
    Lazy    no         
    Synchronized  no         
    Abstract   no         
    Autowired   no         
    Autowiring Types - 

現在,當我執行控制器功能,我打電話給我的服務我仍然得到錯誤:

You have requested a non-existent service "appbundle\service\messagegenerator". 

任何ide如?

回答

1

Symfony在命名時有點混亂:您通過請求它的定義名稱來獲取服務:app.message_generator

$messageGenerator = $this->get('app.message_generator'); 
+0

時,或作爲替代方案,在服務定義文件中的類名稱替換app.message_generator。這反過來可以讓你消除類:線,也更符合最新的集裝箱推薦做法。 – Cerad

+0

謝謝@sics,解決了我的問題! – sonja

1

Symfony的最近建議從正在定義的服務爲,類名(AppBundle\Service\MessageGenerator)一個給名(app.message_generator)開關。他們都只是一個叫'服務'的名字。

當您僅定義給定名稱時,您正在嘗試使用這兩種方法。

從長遠來看,建議使用基於::class的名稱,並且很可能允許框架自己查找類,並自行配置它們。這意味着,默認情況下,所有服務都是私有的,並且由服務容器框架&處理。

在此期間,在你學習,你可以:

$messageGenerator = $this->get('app.message_generator'); 

或定義明確定義的服務,並予以公佈,以便它能與->get(...)從容器中取出。

# services.yml 
AppBundle\Service\MessageGenerator: 
    class: AppBundle\Service\MessageGenerator 
    public: true 

# php controller 
$messageGenerator = $this->get(MessageGenerator::class); 

或只是自動注入到控制器,即要求

public function __construct(LoggerInterface $logger, MessageGenerator $msgGen) 
{ 
    $this->messageGenerator = $msgGen; 
} 

public function getMessage() 
{ 
    $result = $this->messageGenerator->do_things(....); 
    $this->logger->info('Success!'); 
} 
+0

謝謝你的回答,它也能解決我的問題,但是Sics更快,所以我接受了他的回答。 :) – sonja

相關問題