2013-04-05 3 views
0

Я продолжаю запутываться при попытке включить файлы, которые будут иметь разные пути в локальной среде или в процессе производства.Получение корня проекта

К примеру, у меня есть это в моем usercontroller.php файле:

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

На моем локальном хосте, usercontroller.php находится в www/myproject/inc/ и config.php в www/myproject/ (корневой директории проекта)

Это терпит неудачу.

Все, что я хочу, это способ определить корень проектов. i.e на localhost это 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

Отлично, спасибо. Я дам это выстрел –

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

А потом, для автоматического получения полного BasePath проекта для использования в другом включает в себя или тому подобное, в вашей конфигурации, вы бы есть что-то вроде:

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

Оттуда, просто использовать BASEPATH, когда требуется полный путь к корню проекта. ^^

Смежные вопросы