通过命名空间包含非类php文件而不使用相对路径

时间:2014-03-24 20:34:53

标签: php path namespaces include composer-php

我有一段时间以来遇到的问题是包含一个“视图”php文件,该文件位于某个位置,我所调用的方法的类已知,但不一定是我调用它的地方。最好通过例子来解释它:

假设我有一个文件被包含在某处,它负责呈现一个表。因为我的应用程序中有许多类似的表,所以我使用带有类似模板的表视图的单独文件,如果我想更改它的某些方面,我会传递所需的参数。

以下是具体的观点:

[MainView.php]


// Convert data from JSON.
/** @var $model MainDataModel */
$model = MainDataModel::rebuildFromJson($_POST["model"]);

// Prepare data for table view
/** @var $data TableViewData */
$data = new TableViewData();
$data->model = $model;
$data->tableBody = "MainTableBody.php";
$data->tableClass = "main-table";
$data->viewClass = "main-view";

/** Attach table. */
// include("../../Common/View/TableView.php"); (1)
include("../../../../vendor/composer/wb/Common/src/View/TableView.php"); (2)

这里是常见的TableView我想将$ data传递给并包含到page:

[TableView.php]
namespace Common\Controller;

use ...

/** @var $data TableViewData  */
if (!(isset($data) && $data->checkForRequiredFields($data))) {
    return;
}

?>
<div class="<?php echo $data->viewClass; ?>">
    <div class="datatable">
        <table class="<?php echo $data->tableClass; ?>">
            <thead>
                <tr>
                <?php /** @var $column ColumnModel */
                    foreach ($data->model->columns as $column): ?>
                       <th><?php echo $column->text ?></th>
                <?php endforeach; ?>
                </tr>
            </thead>
            <tbody class="datatable-body">
                <?php include($data->tableBody); ?>
            </tbody>
         </table>
    </div>
</div>

只要我使用include(1),一切都很好(相对),但是当我切换到作曲家时,我也将公共类分开并将它们放在一些远程位置,我真的不应该关心。

换句话说,有些东西告诉我,我不需要了解TableView.php的确切路径,相对于我使用它的地方而言,可能必须有更好的方法来使用它。显然,(2)并不是很有效,如果这种愚蠢的方式有效,我会感到惊讶。

所以现在我的问题是:每次使用它时如何在不使用相对路径的情况下包含该视图(TableView)?包含和访问控制器类(TableViewController?)的东西,它与TableView位于同一目录中,并保存有关TableView绝对定位的信息?

解决这个问题的另一个方法是让类返回视图,然后按命名空间调用类,但这是解决方法,而不是解决方案。

1 个答案:

答案 0 :(得分:0)

在使用各种路径函数和常量后,我找到了解决问题的方法。它不是太整洁,但它仍然有效。这是:

[TableViewController.php]
(...)
public static function getTableViewPath() {
        return __DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "View" . DIRECTORY_SEPARATOR
            . "TableView.php";
    }  
(...)

[MainView.php]
(...)
/** Attach table. */
include(TableViewPresenter::getTableViewPath());
(...)