簡體   English   中英

Symfony2 - 如何注入可選參數

[英]Symfony2 - How to inject an optional parameter

假設我有一個論壇服務。 此服務需要一個論壇API的URL。 我想要的是該URL是內部的還是外部的。

如果是內部的 ,它將是路由 ,在routing.yml中配置並由路由器服務返回。

如果是外部的 ,它將是參數 ,在parameters.yml中配置。

我想到的方法是:

在parameters.yml中查找變量forum_url。 如果它不存在,請嘗試獲取該路線。 否則,拋出異常。

services:
    forums:
        class: Acme\ForumsBundle\ForumService
        arguments: ["@doctrine.orm.entity_manager","@router", "%forum_url%"]

這個實現的問題是,如果沒有定義變量,它會拋出一個異常,所以我需要的是將它定義為一個可選參數 (就像你可以用服務( “@?service” )一樣。

即使是冷卻器也能夠定義如下內容:

"%forum_url% ? %forum_url% : @router"

關於如何實現這一目標的任何想法?

PS:如果還有另一種“更好的做法”方法,我願意接受投入。

你可以用幾種方式做到這一點。

  1. 使%forum_url%不是一個可選但必須參數,但是當你想要內部網址時,只需將null值( ~ %forum_url% in yml)設置為%forum_url%參數。 然后,將%forum_url%@router注入您的服務並檢查%forum_url% :如果它不為null則使用它,如果它為null則使用route

  2. 更好的方式是創建另一個服務,讓我們稱之為url_resolver 您將此新服務注入ForumService url_resolver服務中,您可以執行第1點中描述的操作,因此您需要注冊必需的%forum_url%@router 這比選項1更簡單

  3. 將整個容器注入ForumService並檢查是否設置了%forum_url% 但是,請注意將整個容器注入服務被認為是一種不好的做法

如果你的symfony版本支持表達式語言,你可以這樣做:“@ = container.hasParameter('forum_url')?parameter('forum_url'):service('router')” http://symfony.com/doc /current/service_container/expression_language.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM