2012-11-01 5 views
7

In dem Bemühen, meinen Code DRY behalten möchte ich in der Lage sein, "Cross-Controller" Variablen zu definieren.Cross-Controller-Variablen in Phalcon

Klassisches Beispiel ist, dass ich gerne auf einige Konfigurationselemente zugreifen möchte, die in meinem Bootstap geladen werden.

Was ist die Best-Practice-Methode, um dies zu erreichen?

Tim

Antwort

7

Sie können immer den Di-Container verwenden.

Sobald Sie eine Komponente in Di registrieren, ist es in der Steuerung durch die magische Methode verfügbar. Zum Beispiel:

// Bootstrap 
$configFile = ROOT_PATH . '/app/config/config.ini'; 

// Create the new object 
$config = new \Phalcon\Config\Adapter\Ini($configFile); 

// Store it in the Di container 
$this->di->setShared('config', $config); 

und in Ihrem Controller ist es so einfach wie:

$config = $this->config; 

Wenn Sie eine Basis Controller-Klasse erstellen, können Sie die Objekte in der Ansicht wie so bei Bedarf passieren können:

$this->view->setVar('config', $this->config); 

Schließlich kann der Di-Container auch als Registrierung dienen, in der Sie Elemente speichern, die Sie in Ihrer Anwendung verwenden möchten.

Ein Beispiel für Bootstrapping und Zugriff auf Objekte in Controllern finden Sie im Repository phalcon/website. Es implementiert unter anderem Bootstrapping- und Basiscontrollermuster.

+2

Danke dafür! Funktioniert wirklich gut – Tim

+1

Ich weiß, ich bin ein bisschen spät, aber warum in diesem Szenario würden Sie $ di> set() über $ di> setShared() verwenden? – Mechzeit

+0

@Spinket 'setShared' könnte hier besser verwendet werden - Sie haben Recht - da' $ config' wirklich in der App verwendet wird und ein gemeinsames Objekt sein muss. Ich habe meine Antwort entsprechend geändert, danke! –

2

Das folgende ist mein Setup. Hier

[PHP]  5.4.1 
[phalcon] 1.2.1 

ist ein Auszug aus meinem Bootstrap. (/ App-root/public/index.php)

$di = new \Phalcon\DI\FactoryDefault(); 

    // I'll pass the config to a controller. 
    $di->set('config', $config); 

    $application = new \Phalcon\Mvc\Application(); 
    $application->setDI($di); 
    echo $application->handle()->getContent(); 

Und dies ist ein Auszug aus meinen Basis-Controller. (/ App-root/app/controllers/ControllerBase.php)

class ControllerBase extends Phalcon\Mvc\Controller 
    { 
      protected $config; 

      protected function initialize() 
      { 
        $this->config = $this->di->get('config'); 
        $appName  = $this->config->application->appName; 
+0

cool context - und: löst das die Frage :-) – kleopatra

+0

Danke. Ja, das tut es. – Sankame