2013-04-05 163 views
0

當試圖包含在本地環境與生產環境中具有不同路徑的文件時,我總是感到困惑。獲取項目根目錄

例如,我有這個在我的usercontroller.php文件:

require_once(__DIR__ . '/config.php'); 

在我的本地主機,usercontroller.php位於www/myproject/inc/config.phpwww/myproject/(項目根目錄)

這種失敗。

我想要的是一種定義項目根的方法。即在本地主機上它是www/projectname而在製作中它是/由於文件位於本地主機上的projectname目錄內,因此導致我的生產服務器出現問題。

什麼是簡單定義基本路徑並從中構建我的require_once的最佳方法?

require_once($basePath . 'inc/filename.php'

回答

1

大多數項目使用config.inc.php文件位於在這些東西可以定義一個共同的地方。

的config.inc.php

define('ROOT_FOLDER', '/'); 
define('APPLICATION_LINK', 'http://www.example.com/mysite'); 

的script.php

require ('../config.inc.php'); 
echo '<a href="' . APPLICATION_LINK . '">Go home</a>'; 
0

每個項目應該包含保留此信息的config.php文件。

的config.php

define('ENVIRONMENT', 'PRODUCTION'); 
// define('ENVIRONMENT', 'TESTING'); 
// define('ENVIRONMENT', 'DEVELOPMENT'); 

switch (ENVIRONMENT) { 
    case 'PRODUCTION': 
     define('BASE_URL', 'http://www.mysite.com'); 
     define('BASE_PATH', '/'); 
     break; 
    case 'TESTING': 
     define('BASE_URL', 'http://test.mysite.com'); 
     define('BASE_PATH', '/test/'); 
     break; 
    case 'DEVELOPMENT': 
     define('BASE_URL', 'http://localhost/'); 
     define('BASE_PATH', '/www/myproject/'); 
     break; 
} 

那麼也許有一個URL輔助文件。

url_helper.php

function site_url($relative) { 
    return BASE_URL . $relative; 
} 

function redirect($uri = '', $method = 'location', $http_response_code = 302) { 
    if (! preg_match('#^https?://#i', $uri)) { 
     $uri = site_url($uri); 
    } 

    switch($method) { 
     case 'refresh' : header("Refresh:0;url=".$uri); 
       break; 
     default : header("Location: ".$uri, TRUE, $http_response_code); 
       break; 
    } 
    exit; 
} 

和負載幫手。

load_helper.php

function load_file($uri) { 
    require BASE_PATH . $uri; 
} 

function load_class($class) { 
    if (! class_exists($class)) 
     load_file('class/' . $class); 
} 

這些功能可能會更穩健,以滿足您的需求。優點是您可以針對生產/開發,各種服務器或僅針對特定環境使用不同的配置。如果您始終使用site_url函數在您的站點周圍生成URL,則可以通過在單個文件中進行更改來輕鬆更改URL的解釋方式。

+0

太好了,謝謝。我會給這個鏡頭 – 2013-04-05 00:25:16

0

也許這樣的事情可以做到這一點!

switch(dirname(__FILE__)) { 
case '/www/myproject/inc/': 
    //DEFINE SOMETHING 
break; 
case '/www/myproject/': 
    //DEFINE SOMETHING 
break; 
} 
0

正如docs__DIR__表示返回它被使用的文件的目錄。

DIR - 文件的目錄。如果在include中使用,則返回包含文件的目錄。這相當於dirname(FILE)。除非目錄名是根目錄,否則該目錄名沒有結尾斜槓。 (在PHP 5.3.0中添加)

要將文件包含在外部目錄中,您必須使用..來「脫離」內部目錄。

require_once(__DIR__ . '../config.php'); 

在一個側面說明,我建議你看看FIG's autoloading standards如果你正在使用PHP的命名空間。

0

我知道這個答案已經晚了,但是你還沒有接受任何答案,所以我想我會把它用在我的大部分應用程序中。首先要做的第一件事情是,從您撥打config.php的文件開始,您將始終需要使用相關參考,例如您的示例中的require_once '../config.php';。當然,你可以從PHP命令'收集'配置文件的完整路徑,但是爲什麼你會這樣做,當你知道它的一個目錄,然後在其中,你可以在整個項目的基礎路徑define。例如,在你的www/myproject/inc/usercontroller.php文件,頂部看起來像:

<?php 
require_once '../config.php'; 

,然後到自動獲得該項目的全部基本路徑用於其他用途包括或類似的,在你的配置,你會碰到這樣的:

<?php 
$basepath = dirname(__FILE__); 
define('BASEPATH', $basepath); 
//Or all in one line: 
define('BASEPATH', dirname(__FILE__)); 

從那裏,只需使用BASEPATH當你需要將項目的根目錄的完整路徑。 ^^