2016-04-06 11 views
2

Ich möchte Container vom Controller neu kompilieren, wenn ich $this->container->compile();Symfony2 recompile Behälter von der Steuerung

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(); 
} 

verwenden bekam ich einen Fehler: Sie können keine abgeladen gefrorenen Behälter

Ich möchte kompilieren wissen, ob, wenn ich löschen der Cache vom Controller wird der Container neu kompilieren?

+0

Was versuchen Sie zu erreichen? –

Antwort

1

Wenn Sie versuchen, Werte von Parametern zu erhalten, die während der Anforderung geändert wurden, können Sie dies tun:

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; 
} 

Auch, wenn Sie den Cache von einem Controller löschen müssen, gibt es eine sauberere Weg :

$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

meine Parameter sind in der Datenbank gespeichert – ghazi2008

+0

Und so? Brauchst du, dass ich das Beispiel für eine 'parameter.php' Datei anpasse? – chalasr

+0

Ich lese hier, dass, wenn der Cache gelöscht wird, der Container https://knpuniversity.com/screencast/symfony-journey-di/symfony-builds-the-container – ghazi2008

0
kurz

die Antwort nein ist, wird nicht der Behälter neu kompiliert werden, da sie bereits in dem Speicher geladen wird, und die aktuelle Anfrage keine wirksam wird Dateien von der Festplatte zu löschen. Und bei der nächsten Anfrage wird der Cache aufgewärmt und der Container wird kompiliert, bevor Sie den Controller erreichen.