2013-04-12 122 views
0

我正在爲我的一個庫編寫一個路由器類。 這個類將保留一些路徑的位置,但我想知道是否應該使用'智能'絕對路徑,相對路徑或兩者(對於這種情況)將是相同的事情。PHP:'智能'絕對路徑vs相對路徑

Obs.1:當我寫'智能'絕對路徑是因爲即使管理員將庫移動到另一個位置,此絕對路徑也可以工作。 Obs.2:Stack有關於這個話題的其他問題,但看起來他們不是關於我在找什麼,所以我做了這個問題。

第一溶液:

MyVendor/src/class/MyVendor/MyNamespace/Router.php使用 '智能' 絕對路徑

namespace MyVendor\MyNamespace; 

class Router 
{ 
    private $root; 
    private $cache; 

    public function __construct() 
    { 
     $this->setRootPath(); 
     $this->cache = "{$this->root}var/cache/"; 
    } 

    public function setRootPath() 
    { 
     $currentDir = __DIR__; 

     $exploded = explode("/", $currentDir); 

     array_pop($exploded); // Removing MyNamespace 
     array_pop($exploded); // Removing MyVendor 
     array_pop($exploded); // Removing class 
     array_pop($exploded); // Removing src 

     $this->root = implode("/", $exploded)."/"; 
    } 
} 

第二溶液:

MyVendor/src/class/MyVendor/MyNamespace/Router.php使用相對路徑

namespace MyVendor\MyNamespace; 

class Router 
{ 
    private $root; 
    private $cache; 

    public function __construct() 
    { 
     $this->setRootPath(); 
     $this->cache = "{$this->root}var/cache/"; 
    } 

    public function setRootPath() 
    { 
     $this->root = __DIR__."/../../../../"; 
     // ..(pointing to MyVendor)/..(pointing to class)/..(pointing to src)/..(pointing to the root, MyVendor) 
    } 
} 

Obs.3:請參閱第一解決方案將使用像鏈接:

root => `/var/www/myproject/vendor/MyVendor/` 

cache => `/var/www/myproject/vendor/MyVendor/var/cache` 

,第二個將使用像鏈接:

root => `/var/www/myproject/vendor/MyVendor/src/class/MyVendor/MyNamespace/../../../../` 

cache => `/var/www/myproject/vendor/MyVendor/src/class/MyVendor/MyNamespace/../../../../var/cache/` 

Obs.4:初始處理(使用array_pop)是與我無關。

那麼,我應該使用什麼解決方案,爲什麼?有沒有更好的方法來做到這一點(如果是的話,請寫一個路由器類替代)?

+0

我喜歡儘可能使用絕對值,但我很想聽聽其他人的推理。 – Sam

+0

當爆炸路徑時(假設你的庫可以在Windows系統上運行),你應該使用'DIRECTORY_SEPARATOR' – Uby

+0

好的軟件Uby,我會編輯 – GarouDan

回答

0

爲什麼不簡單地問它呢?

namespace MyVendor\MyNamespace; 

class Router 
{ 
    private $root; 
    private $cache; 

    public function __construct($rootPath) 
    { 
     $this->root = $rootPath; 
     $this->cache = "{$this->root}var/cache/"; 
    } 
} 

注入根路徑允許您的庫的客戶端將其(物理)放在任何他們想要的位置。在你的例子中,你假設根路徑是4層;如果不是這樣的話呢?

+0

您建議將rootpath作爲參數傳遞?但我想自動配置根路徑,沒有傳遞參數。路由器將是我將要運行的第一件事情之一。 – GarouDan

+0

爲什麼你的路由器無論如何都需要一個路徑?你應該考慮使用自動加載。 – Alfwed

+0

Alfwed,如果你正在使用作曲家(情況就是這樣,我的內部結構應該保留)。您可以將lib放在myproject/lib或我的項目/供應商中......但是,例如,我的緩存文件夾將始終位於MyVendor/var/cache中 – GarouDan

0

首先,如果您決定使用它(爲開發者簡化它並使其更容易預測),我肯定會在您的相對路徑上使用realpath()。其次,我會放棄你的array_pop()技術,如果你決定重新組織,那麼這種技術會很快分崩離析。

我會選擇preg_replace('#^'.$FS_ROOT.'#', __FILE__);類型的方法來確定被調用的內容。

我認爲你應該看看你的信息流中的逆向,並通過你的項目的「基礎」,然後確定一切。當你移動它或者有多個代碼運行用於開發時,這會爲你節省很多頭痛。

+0

第一個建議與使用__DIR__相同嗎?和第二個提議者$ FS_ROOT與$ _SERVER [「DOCUMENT_ROOT」]是一樣的東西?如果是,我嘗試使用這個時遇到問題 – GarouDan