2013-04-05 165 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当你需要将项目的根目录的完整路径。 ^^