2012-05-17 28 views
21

Tôi đang sử dụng symfony 2 và chúng tôi có 2 cấu hình, dev và prod. Tôi cần phải biết nếu tôi có thể tìm ra một im sử dụng bên trong một thực thể hoặc mô hình.Truy cập biến môi trường AppKernel trong symfony 2

Tôi đang tìm một cái gì đó tương tự như mã này được tìm thấy trong AppKernel.php:

$this->getEnvironment() 

Nếu tôi có thể nạp Kernel gọi này sẽ là tuyệt vời nhưng tôi không thể tìm thấy một cách để làm điều này. Sau khi nhìn vào điều này, có vẻ như các sự kiện của symfony có thể trả về Kernel nhưng tôi không biết làm thế nào hoặc ở đâu để nắm bắt các sự kiện này để tôi có thể gọi hàm getKernel() trên chúng. http://symfony.com/doc/current/book/internals.html

Ví dụ, họ liệt kê ví dụ này:

sử dụng Symfony \ Component \ HttpKernel \ Event \ FilterControllerEvent;

public function onKernelController(FilterControllerEvent $event) 
{ 
    $controller = $event->getController(); 
    // ... 

    // the controller can be changed to any PHP callable 
    $event->setController($controller); 
} 

Không rõ ràng nơi tôi đặt khối mã này. Dường như với tôi rằng nó nên đi trong hạt nhân, và nếu tôi có hạt nhân tôi sẽ không gặp vấn đề này.

Câu hỏi của tôi là, có cách dễ dàng để tôi xác định xem mình có đang ở 'dev' hoặc 'prod' như được đặt trong hạt nhân hay không, từ Dịch vụ hoặc Mô hình. Cảm ơn

Trả lời

44

Các lớp thực thể mặc định được tạo bởi bảng điều khiển không kế thừa bất kỳ thứ gì. Điều này có nghĩa là chúng không phải là "ContainerAware" theo bất kỳ cách nào.

Và nói chung, tôi không nghĩ họ nên như vậy. Tôi nghĩ nó phụ thuộc vào những gì bạn đang làm nhưng bạn có thể xử lý này với một số dependency injection cơ bản

Trong một bộ điều khiển:

$entity = new \Your\Bundle\Entity\Foo(
    $this->container->get('kernel')->getEnvironment() 
); 

Và sau đó trong src/bạn/Bundle/Entity/Foo.php

private $env; 

public function __construct($env=null) 
{ 
    $this->env = $env; 
} 

Điều này có phù hợp với bạn không?

P.S. Trình nghe sự kiện mà bạn đã đăng là dành cho Bộ điều khiển - không dành cho các lớp tùy ý.

+0

Vâng, cảm ơn bạn, điều đó đã sẽ làm việc độc đáo với một chút refactoring – ContextSwitch

+0

Tôi đang sử dụng Symfony 2,6 và tôi phải làm: $ kernel = $ this-> container-> get ('kernel'); – Dominick

18

Cũng có thể lấy thông số đó làm tham số. Nếu bạn nhìn vào lớp \Symfony\Component\HttpKernel\Kernel, bạn sẽ tìm thấy phương thức getKernelParameters() hiển thị tất cả các tham số hạt nhân.

/** 
* Returns the kernel parameters. 
* 
* @return array An array of kernel parameters 
*/ 
protected function getKernelParameters() 
{ 
    $bundles = array(); 
    foreach ($this->bundles as $name => $bundle) { 
     $bundles[$name] = get_class($bundle); 
    } 

    return array_merge(
     array(
      'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir, 
      'kernel.environment' => $this->environment, 
      'kernel.debug' => $this->debug, 
      'kernel.name' => $this->name, 
      'kernel.cache_dir' => realpath($this->getCacheDir()) ?: $this->getCacheDir(), 
      'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(), 
      'kernel.bundles' => $bundles, 
      'kernel.charset' => $this->getCharset(), 
      'kernel.container_class' => $this->getContainerClass(), 
     ), 
     $this->getEnvParameters() 
    ); 
} 

Vì vậy, trong một tập tin services.yml bạn có thể nhận được môi trường với %kernel.environment% trong khi trong một lớp học nhận thức được chứa bạn có thể nhận được nó bằng cách làm:

$this->getContainer()->getParameter('kernel.environment'); 

see Kernel.php class on github

+0

Tôi khuyên bạn nên gọi phương thức 'parent :: getKernelParameters()' để chắc chắn không quên bất kỳ tham số nào nếu một tham số được thêm vào trong các phiên bản tiếp theo của symfony :) 'return array_merge (parent :: getKernelParameters() , mảng (...)); ' –

3

Tất nhiên đó là nhanh chóng và cách bẩn thỉu ...

function quickAndDirty() { 
    global $kernel; 

    if ($kernel->getEnvironment() == 'dev') { 
     // we're in dev mode 
    } 
} 

Điều xấu và xấu và bạn nên tự rửa mình sau khi sử dụng nó, nhưng trong trường hợp một hệ thống mã hóa lớn hiện có mà bạn có thể kế thừa, nó sẽ giúp bạn tránh được cơn ác mộng tái cấu trúc.

Tất nhiên, cho dù bạn có thể sống với chính mình sau khi sử dụng một phương pháp như vậy, là tùy thuộc vào bạn;)

Các vấn đề liên quan