0

私のライブラリの Router クラスを書いています。このクラスはいくつかのパスの場所を保持しますが、「インテリジェントな」絶対パス、相対パス、またはその両方 (この場合) を使用する必要があるかどうかは疑問です。

Obs.1: 「インテリジェントな」絶対パスを書いたのは、管理者がライブラリを別の場所に移動しても、この絶対パスが機能するためです。

Obs.2: スタックにはこのトピックに関する他の質問がありますが、それらは私が探しているものではないように見えるので、質問しました。

最初の解決策:

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)."/";
    }
}

2番目の解決策:

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`

2 つ目は次のようなリンクを使用します。

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 クラスの代替を作成してください)。

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 ディレクトリ上にあるとします。そうでない場合はどうなりますか?

于 2013-04-12T16:36:47.937 に答える
0

まず、あなたがそれを使用することに決めた場合、私は間違いなくrealpath()あなたの相対パス作業で使用します(開発者のために単純化し、予測を容易にします).

第二に、私はあなたの array_pop() テクニックを省きます。これは、物事を再編成することにした場合、非常に速く崩壊します。

preg_replace('#^'.$FS_ROOT.'#', __FILE__);何が呼び出されているかを判断するには、型のアプローチを選択します。

情報の流れの逆を見て、プロジェクトの「ベース」を渡し、そこからすべてを決定する必要があると思います。これにより、コードを移動したり、開発のためにそのコードの複数のコピーを実行したりするときに、頭痛の種が大幅に軽減されます。

于 2013-04-12T16:42:08.703 に答える