获取与控制器关联的 table 名称

Get the table name associated to the controller

我正在编写一个非常通用的数据操作脚本。为此,我需要知道与当前控制器关联的 table 名称。不知怎的,我不知道如何得到它。


更新

通常,每个控制器在 template/<name> 目录中都有以下 PHP 个文件:

  1. add.php
  2. edit.php
  3. index.php
  4. 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());
}