2009-06-25 19 views
1

Ich brauche etwas ähnlich der folgenden in meinem CodeIgniter Projekt zu erstellen: -Wie Laden von Konfigurationsdateien in CodeIgniter?

  • my_config.php
  • config_production.php
  • config_development.php

Nun wird my_config.php automatisch geladen werden. Von dort wird, wenn es sich um Produktionsserver handelt, config_production.php geladen; sonst wird config_development.php geladen.

Wie soll ich das ausführen?

Ich habe nach dem in my_config.php versuchte dabei:

<?php 
if(gethostbyaddr ("127.0.0.1") == 'hello.sabya'){ 
    $this->config->load('config_production'); 
} else { 
    $this->config->load('config_development'); 
} 
?> 

Es wird nicht als $this->config Arbeits initialisiert nicht. Wie kann ich das erreichen?

Antwort

4

zwei Möglichkeiten: Sie können versuchen, das Objekt mit „$ CI“ anstelle von „$ this“ Referenzierung:

$CI =& get_instance(); //do this only once in this file 
$CI->config->load(); 
$CI->whatever; 

... was der richtige Weg ist, um das CI-Objekt von außen zu verweisen.

Oder zweitens, könnten Sie configs aus config.php wechseln:

<?php 
if(gethostbyaddr ("127.0.0.1") == 'hello.sabya'){ 
    $config['base_url'] = "http://dev.example.com/"; 
} else { 
    $config['base_url'] = "http://prod.example.com/"; 

} 
?> 

... etc. Laden Sie alle Unterschiede zwischen den beiden if/else Blöcken.

+0

+1 genau. Ich habe so etwas gemacht und es hat funktioniert. – Sabya

0

Wann benötigen Sie die konfigurierte Konfiguration? - Könnten Sie nicht eine hook definieren, um die korrekte Konfiguration zu laden, nachdem alles andere initialisiert wurde, aber bevor der Controller ausgeführt wurde?

0

Ich habe es wie folgt arbeiten: -

$ci = & get_instance(); 

if (gethostbyaddr ("127.0.0.1") == 'production.example.com') { 
    //Load production configuration 
    $ci->load->config('config_production'); 
} elseif(gethostbyaddr ("127.0.0.1") == 'staging.example.com') { 
    //Load staging configuration 
    $ci->load->config('config_staging'); 
} else { 
    //Load development configuration 
    $ci->load->config('config_development'); 
} 
+1

Nur aus "besserer Praxis" sollten Sie wahrscheinlich so etwas tun: $ host = gethostbyaddr ("127.0.0.1"); if ($ host == 'production.example.com') { Auf diese Weise müssen Sie nur einmal gethostbyaddr aufrufen. – cwallenpoole

+0

+1. Ja, sicher. – Sabya

0

Ich benutze dies in meinem Fall. Für index.php

switch ($_SERVER['SERVER_NAME']) { 
case 'localhost': 
    define('ENVIRONMENT', 'development'); 
    break; 
case 'example.com': 
    define('ENVIRONMENT', 'production'); 
    break; 
default: 
    define('ENVIRONMENT', 'production'); 
    break; 
} 

für base_url in application/config.php:

switch ($_SERVER['SERVER_NAME']) { 
case 'localhost': 
    $config['base_url'] = "http://localhost/my_app/"; 
    break; 
case 'example.com': 
    $config['base_url'] = "http://example.com/"; 
    break; 
default: 
    $config['base_url'] = "http://example.com/"; 
    break; 
} 

für Datenbank in application/database.php:

switch ($_SERVER['SERVER_NAME']) { 
case 'localhost': 
    $db['default']['username'] = 'root'; 
    $db['default']['password'] = '123456'; 
    break; 
case 'example.com': 
    $db['default']['username'] = 'user'; 
    $db['default']['password'] = 'pass'; 
    break; 
default: 
    $db['default']['username'] = 'user'; 
    $db['default']['password'] = 'pass'; 
    break; 
} 
0

Warum Umgebungen nicht verwenden? - http://codeigniter.com/user_guide/general/environments.html

Auch die Konfigurationsdateien sind nur Arrays. Warum nicht einfach einbinden und mit dem bestehenden Array verschmelzen? Oder noch besser in index.php:

if (gethostbyaddr ("127.0.0.1") == 'production.example.com') 
{ 
    include(APPPATH.'config/config_production.php'); 
} 
elseif (gethostbyaddr ("127.0.0.1") == 'staging.example.com') 
{ 
    include(APPPATH.'config/config_staging.php'); 
} 
else 
{ 
    include(APPPATH.'config/config_development.php'); 
} 

foreach ($config AS $key => $item) 
{ 
    $assign_to_config[$key] = $item; 
} 

Aber der beste Weg ist die Verwendung von Umgebungen meiner Meinung nach.

3

Wie Eric erwähnt verwenden environments.

Je nach der aktuellen -Umgebung können unterschiedliche Konfigurationsdateien geladen werden.

Um eine umgebungsspezifische Konfigurationsdatei zu erstellen, erstellen oder kopieren eine Konfigurationsdatei in application/config/{ENVIRONMENT}/{filename} .php

Hinweis: CodeIgniter immer versucht, die Konfigurationsdateien zu laden für die aktuelle Umgebung zuerst. Wenn die Datei nicht existiert, wird die globale Konfigurationsdatei (d. H. Die in application/config /) geladen. Diese bedeutet, dass Sie nicht verpflichtet sind, alle Ihre Konfigurationsdateien in einem Umgebungsordner zu platzieren - nur die Dateien, die sich per Umgebung ändern.

Warum Logik implementieren, wenn es schon da ist? ;)

1

Das ist alt und hat bereits eine akzeptierte Antwort, aber ich habe eine Lösung gefunden, die meiner Meinung nach gut funktioniert. Wie @Eric bereits erwähnt hat, ist der beste Weg, dies zu tun, die eingebaute Funktionalität der Umgebungsvariablen zu verwenden, um die Konfigurationslogik zu bestimmen. Das Problem, das ich bei diesem Ansatz hatte, ist, dass viele redundante Werte beibehalten werden müssen und häufig eine zentrale Standardkonfiguration gewünscht wird, die für alle Umgebungen ausgeführt wird und nur umgebungsspezifische Werte die Standardwerte ersetzen.

Ihre Ordnerstruktur sollte sein:

/app/config/config.php 
/app/config/development/config.php 
/app/config/production/config.php 

Dann in Ihrer Umgebung spezifischen Konfigurationsdateien, verwenden Sie die folgenden als Ausgangspunkt:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

// Set the default values first, then we'll overwrite environmental-specific values 
include(APPPATH . '/config/' . pathinfo(__FILE__, PATHINFO_BASENAME)); 

dies als Ausgangspunkt verwenden lassen Sie tun genau das gleiche für Datenbank.php, etc. - alle/config/Datei, die Sie für eine umgebungsspezifische Version benötigen, ohne Ihre eigene Environment-Loading-Logik zu schreiben, die CI bereits bereitstellt.

Verwandte Themen