2016-11-21 51 views
0

我想在控制器外部訪問我的配置變量。

當我嘗試:

class pdfFooter extends \TCPDF 
{ 
public function footer() 
{ 
    $config = $this->get('core_parameters'); 
} 
} 

我得到這個錯誤:

Uncaught PHP Exception Symfony\Component\Debug\Exception\UndefinedMethodException: "Attempted to call an undefined method named "get" of class "Plugin\PrintBundle\Controller\pdfFooter".

簡單地調用:

$this->writeHTMLCell($config->getParameter('heading_color_config')); 

觸發它。我遇到的這個問題的大多數其他主題都建議將其全球化。當然有更好的方法?

+1

剛注入容器,https://stackoverflow.com/questions/40692433/how-to-get-the-root-path-in-helper-class-symfony2/40693266#40693266 – Federkun

+1

不管你做什麼,都不要注入容器。相反,學習一些關於服務的知識,然後注入配置對象。 http://symfony.com/doc/current/service_container.html – Cerad

+0

爲什麼要注入容器是壞的? (愚蠢的問題,我敢肯定,我是Symfony的新手) – billblast

回答

3

您必須注入容器,以便您可以訪問您需要的服務和參數。

但是,像@Cerad說的那樣,主要原因(其中包括許多:無類型提示,無法控制使用的服務,RunTime編譯錯誤,缺少依賴關係等)爲什麼注入容器不是一個好主意,因爲依賴關係替換:如果在庫中定義了服務,那麼您將無法使用本地依賴關係來替換依賴關係,從而滿足您的需求[1]

如果可能的話,你應該避免它。 這裏是什麼樣子注入只是你需要的參數:

(該PARAMS必須definef提前在配置文件)

services: 
    yourapp.bundle.pdffooter: 
     class: App\Bundle\Foo\pdfFooter 
     arguments: ['%param1%','%param2%',...] 

在你的類:

class pdfFooter 
{  
private $param1; 
private $param2; 
// ... 

public function __construct($param1,$param2,...) 
{ 
    $this->param1 = $param1; 
    $this->param2 = $param2; 
    // ... 
} 

public function footer() 
{ 

    // you can access your params directly here 
} 
+0

不完全。首先,ContainerInterface在這裏對你沒有任何幫助。其次,不使用容器的原因與大小和內存使用量無關。考慮調整你的答案以顯示被注入的core_parameters? – Cerad