2016-04-06 10 views
2

Я хочу, чтобы перекомпилировать контейнер от контроллера, когда я использую $this->container->compile();Symfony2 перекомпиляция контейнер из контроллера

public function changeAction(Request $request) 
{ 
    //...... 
    echo($this->container->getParameter('mailer_user')."\n"); 
    /*$cmd='php ../app/console cache:clear'; 
    $process=new Process($cmd); 
    $process->run(function ($type, $buffer) { 
     if ('err' === $type) { 
      echo 'ERR > '.$buffer; 
     } 
     else { 
      echo 'OUT > '.$buffer; 
     } 
    });*/ 

    $this->container->compile(); 
    echo($this->container->getParameter('mailer_user')."\n"); 
    die(); 
} 

Я получил сообщение об ошибке: Вы не можете скомпилировать сбрасывали замороженный контейнер

Я хочу знать, если когда я очищаю кеш от контроллера, контейнер будет перекомпилировать?

+0

Что вы пытаетесь достичь? –

ответ

1

Если вы пытаетесь получить значения параметров, которые были изменены во время запроса, вы можете сделать это:

use Symfony\Component\Config\FileLocator; 
use Symfony\Component\Config\Loader\LoaderResolver; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; 

public function changeAction(Request $request) 
{ 
    $originalParam = $this->container->getParameter('mailer_user'); 

    // Rebuild the container 
    $container = new ContainerBuilder();  
    $fileLocator = new FileLocator($this->getParameter('kernel.root_dir').'/config'); 

    // Load the changed config file(s) 
    $loader = new PhpFileLoader($container, $fileLocator); 
    $loader->setResolver(new LoaderResolver([$loader])); 
    $loader->load('parameters.php'); // The file that loads your parameters 

    // Get the changed parameter value 
    $changedParam = $container->get('mailer_user'); 

    // Or reset the whole container 
    $this->container = $container; 
} 

Кроме того, если вам нужно очистить кэш от контроллера, есть уборщик способ :

$kernel = $this->get('kernel'); 
$application = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel); 
$application->setAutoExit(false); 

$application->run(new \Symfony\Component\Console\Input\ArrayInput(
    ['command' => 'cache:clear'] 
)); 
+0

Мои параметры хранятся в базе данных – ghazi2008

+0

И так? Вам нужно, чтобы я адаптировал пример файла 'parameters.php'? – chalasr

+0

Я прочитал здесь, что, когда кеш очищается, контейнер перестраивается. https://knpuniversity.com/screencast/symfony-journey-di/symfony-builds-the-container – ghazi2008

0

Короче говоря, ответ нет, контейнер не будет перекомпилировать, так как он уже загружен в память, и удаление файлов с диска не будет принимать никакого влияния на текущий запрос. И в следующем запросе кеш будет разогреваться, и контейнер будет скомпилирован до того, как вы достигнете контроллера.