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


Including a non-class php file via namespace without using relative path

我已经有一段时间的问题是包括一个"视图"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),一切都很好(相对而言),但是当我切换到composer时,我也分离了公共类并将它们放在一些远程位置,我真的不应该关心。

也就是说,有些东西告诉我,我不需要知道tableview。php的确切路径,相对于我使用它的地方可能有更好的方法来使用它。显然,(2)行不通,如果这种愚蠢的方法能奏效,我会感到惊讶。

现在我的问题是:我怎么能包括那个视图(TableView)而不使用相对路径每次我使用它?包括和访问控制器类(TableViewController?),这是在同一个目录下的TableView和保存关于绝对定位的TableView的信息?

解决这个问题的一种方法也是让类返回视图,然后通过名称空间调用类,但这是一种变通方法,而不是解决方案。

在摆弄了各种路径函数和常量之后,我得到了一个问题的一些解决方案。它不太整洁,但它仍然有效。

[TableViewController.php]
(...)
public static function getTableViewPath() {
        return __DIR__ . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . "View" . DIRECTORY_SEPARATOR
            . "TableView.php";
    }  
(...)
[MainView.php]
(...)
/** Attach table. */
include(TableViewPresenter::getTableViewPath());
(...)