我有一段时间以来遇到的问题是包含一个“视图”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绝对定位的信息?
解决这个问题的另一个方法是让类返回视图,然后按命名空间调用类,但这是解决方法,而不是解决方案。
答案 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());
(...)