获取与控制器关联的 table 名称
Get the table name associated to the controller
我正在编写一个非常通用的数据操作脚本。为此,我需要知道与当前控制器关联的 table 名称。不知怎的,我不知道如何得到它。
更新
通常,每个控制器在 template/<name>
目录中都有以下 PHP 个文件:
add.php
edit.php
index.php
view.php
这意味着我必须在 20 table 秒内维护 80 个文件,这真的很愚蠢。因此,我正在使用 CRUD plugin 来显着减少它,现在我只有一个 my_index.php
,它涵盖了所有受影响的 table 的 index.php
的 20 个物理版本。
为了为每个 table 生成正确的视图,我需要 table 的架构,为此我需要知道 table 名称。
因此:
任何将代码添加到适当控制器的解决方案都不是解决方案,因为我必须再次 touch/maintain 20 个具有相同代码行的文件,这绝对不是 DRY 概念。解决方案必须是我在 my_index.php
.
中有代码 ONCE 的东西
获取当前 table 名称的代码是什么?
我可以 运行 此处描述的代码 https://book.cakephp.org/4/en/orm/table-objects.html#getting-instances-of-a-table-class 但这必须在每个控制器中 运行 并且它有点违反 DRY 概念,因为我必须手动添加它进入每个控制器...我正在寻找更通用的方法。
我是运行宁饼PHP草莓4.1.
默认的 table 短 class 名称是从控制器名称和可能的插件名称派生而来的,它存储在 $modelClass
属性 中\Cake\Datasource\ModelAwareTrait
控制器继承。
在名为 ArticlesController
的控制器中,$this->modelClass
属性将保存 Articles
,如果控制器位于名为 Blog
的插件中,则 [=23] =] 将保持 Blog.Articles
.
经过反复试验,我找到了这个解决方案:
function getTableNameFromController()
{
$controller = $this->getRequest()->getParam('controller');
$controllerResolved = sprintf("%s%sController", 'App\Controller\', $controller );
$dummy = new $controllerResolved();
$tableObject = $dummy->getTableLocator()->get($controller);
$tableName = $tableObject->getTable();
print_r($tableName);
}
我必须将此代码 ONCE 放在 my_index.php
中,我完成了。
我认为这不是最佳解决方案,因为我必须创建一个虚拟控制器实例,我想从中获取 table 名称。
欢迎和接受任何更好的解决方案。
您的控制器应该扩展 AppController
。如果您需要视图中的模式,那么 AppController::beforeFilter
可以完成找到它所需的所有工作,就在控制器中,并将其设置为您的视图可以使用的 $schema 变量。像这样的东西(未经测试,但应该非常接近):
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->set('schema', $this->loadModel()->getSchema());
}
我正在编写一个非常通用的数据操作脚本。为此,我需要知道与当前控制器关联的 table 名称。不知怎的,我不知道如何得到它。
更新
通常,每个控制器在 template/<name>
目录中都有以下 PHP 个文件:
add.php
edit.php
index.php
view.php
这意味着我必须在 20 table 秒内维护 80 个文件,这真的很愚蠢。因此,我正在使用 CRUD plugin 来显着减少它,现在我只有一个 my_index.php
,它涵盖了所有受影响的 table 的 index.php
的 20 个物理版本。
为了为每个 table 生成正确的视图,我需要 table 的架构,为此我需要知道 table 名称。
因此:
任何将代码添加到适当控制器的解决方案都不是解决方案,因为我必须再次 touch/maintain 20 个具有相同代码行的文件,这绝对不是 DRY 概念。解决方案必须是我在 my_index.php
.
获取当前 table 名称的代码是什么?
我可以 运行 此处描述的代码 https://book.cakephp.org/4/en/orm/table-objects.html#getting-instances-of-a-table-class 但这必须在每个控制器中 运行 并且它有点违反 DRY 概念,因为我必须手动添加它进入每个控制器...我正在寻找更通用的方法。
我是运行宁饼PHP草莓4.1.
默认的 table 短 class 名称是从控制器名称和可能的插件名称派生而来的,它存储在 $modelClass
属性 中\Cake\Datasource\ModelAwareTrait
控制器继承。
在名为 ArticlesController
的控制器中,$this->modelClass
属性将保存 Articles
,如果控制器位于名为 Blog
的插件中,则 [=23] =] 将保持 Blog.Articles
.
经过反复试验,我找到了这个解决方案:
function getTableNameFromController()
{
$controller = $this->getRequest()->getParam('controller');
$controllerResolved = sprintf("%s%sController", 'App\Controller\', $controller );
$dummy = new $controllerResolved();
$tableObject = $dummy->getTableLocator()->get($controller);
$tableName = $tableObject->getTable();
print_r($tableName);
}
我必须将此代码 ONCE 放在 my_index.php
中,我完成了。
我认为这不是最佳解决方案,因为我必须创建一个虚拟控制器实例,我想从中获取 table 名称。
欢迎和接受任何更好的解决方案。
您的控制器应该扩展 AppController
。如果您需要视图中的模式,那么 AppController::beforeFilter
可以完成找到它所需的所有工作,就在控制器中,并将其设置为您的视图可以使用的 $schema 变量。像这样的东西(未经测试,但应该非常接近):
public function beforeFilter(Event $event) {
parent::beforeFilter($event);
$this->set('schema', $this->loadModel()->getSchema());
}