0

我正在为我的一个库编写一个路由器类。此类将保留某些路径的位置,但我想知道是否应该使用“智能”绝对路径、相对路径或两者(对于这种情况)将是同一件事。

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)与我无关。

那么,我应该使用什么解决方案,为什么?还有另一种更好的方法吗(如果是,请编写一个路由器类替代方案)?

4

2 回答 2

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;如果不是这样呢?

于 2013-04-12T16:36:47.937 回答
0

首先,如果您决定使用它,我肯定会realpath()在您的相对路径工作中使用它(为开发人员简化它并使其更容易预测)。

其次,我会放弃你的 array_pop() 技术,如果你决定重新组织事情,它会很快崩溃。

我会选择一种preg_replace('#^'.$FS_ROOT.'#', __FILE__);类型方法来确定被调用的内容。

我认为你应该看看你的信息流的反向并传递你项目的“基础”,然后从那里确定一切。当您移动它或运行该代码的多个副本以进行开发时,这将为您省去很大的麻烦。

于 2013-04-12T16:42:08.703 回答