我正在为我的库编写一个Router类。 这个类将保留一些路径的位置,但我想知道我是否应该使用“智能”绝对路径,相对路径或两者(对于这种情况)将是相同的。
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)与我无关。
那么,我应该使用什么解决方案?为什么?还有另一种更好的方法(如果是的话,请编写一个Router类替代方案)?
答案 0 :(得分:0)
为什么不简单地要求它?
namespace MyVendor\MyNamespace;
class Router
{
private $root;
private $cache;
public function __construct($rootPath)
{
$this->root = $rootPath;
$this->cache = "{$this->root}var/cache/";
}
}
注入根路径允许库的客户端(物理地)将其放置在任何他们想要的位置。在你的例子中,你假设根路径是4 dir up;如果不是这样怎么办?
答案 1 :(得分:0)
首先,如果您决定使用它,我肯定会在您的相对路径工作中使用realpath()
(为开发人员简化它并使其更容易预测)。
其次,我会放弃你的array_pop()技术,如果你决定重新组织东西,它将会快速崩溃。
我会选择preg_replace('#^'.$FS_ROOT.'#', __FILE__);
类型的方法来确定所调用的内容。
我认为你应该在你的信息流中反过来看一下你的项目的“基础”,然后从那里确定一切。当你移动它或者为了开发而运行该代码的多个副本时,这将使你非常头疼。