我已经有一段时间的问题是包括一个"视图"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 CommonController;
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());
(...)