Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cakephp 获取与控制器关联的表名_Cakephp - Fatal编程技术网

Cakephp 获取与控制器关联的表名

Cakephp 获取与控制器关联的表名,cakephp,Cakephp,我正在为数据操作编写一个非常通用的脚本。为此,我需要知道与当前控制器关联的表名。不知怎的,我想不出怎么得到它 更新 通常,每个控制器的模板/目录中都有以下PHP文件: add.php edit.php index.php view.php 这意味着对于20个表,我必须维护80个文件,这真的很愚蠢。因此,我使用的是最大限度地减少它,现在我只有一个my_index.php,它涵盖了所有受影响表的index.php的20个物理版本 为了为每个表生成适当的视图,我需要表的模式,为此我需要知道表名 因此:

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

更新

通常,每个控制器的模板/目录中都有以下PHP文件:

add.php edit.php index.php view.php 这意味着对于20个表,我必须维护80个文件,这真的很愚蠢。因此,我使用的是最大限度地减少它,现在我只有一个my_index.php,它涵盖了所有受影响表的index.php的20个物理版本

为了为每个表生成适当的视图,我需要表的模式,为此我需要知道表名

因此:

任何将代码添加到适当控制器中的解决方案都不是解决方案,因为我必须用同一行代码再次触摸/维护20个文件,这绝对不是枯燥的概念。解决方案必须是在我的_index.php中有一次代码的地方

获取当前表名的代码是什么

我可以像这里描述的那样运行这段代码,但这必须在每个控制器中运行,这有点违反了DRY的概念,因为我必须手动将其添加到每个控制器中。。。我正在寻找一种更通用的方法


我正在运行CakePHP草莓4.1。

默认的表短类名是从控制器名和可能的插件名派生而来的,它存储在控制器继承的\Cake\Datasource\modelawarettit的$modelClass属性中


在名为ArticlesController的控制器中,$this->modelClass proeprty将保存文章,如果控制器位于名为Blog的插件中,则该属性将保存Blog.Articles。

默认表短类名源自控制器名和可能的插件名,并且它存储在控制器继承的\Cake\Datasource\modelawaretrit的$modelClass属性中


在名为ArticlesController的控制器中,$this->modelClass proeprty将保存文章,如果该控制器位于名为Blog的插件中,则该属性将保存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);
}
我必须把这段代码放到我的_index.php中一次,我就完成了

我认为这不是一个最佳的解决方案,因为我必须创建一个虚拟的控制器实例,从中获取表名


任何更好的解决方案都是受欢迎和接受的。

在尝试之后,我发现了这个解决方案:

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);
}
我必须把这段代码放到我的_index.php中一次,我就完成了

我认为这不是一个最佳的解决方案,因为我必须创建一个虚拟的控制器实例,从中获取表名


欢迎并接受任何更好的解决方案。

您的控制器应该扩展AppController。如果您需要视图中的架构,那么AppController::beforeFilter可以完成在控制器中查找该架构所需的所有工作,并将其设置为视图可以使用的$schema变量。类似的内容未经测试,但应该非常接近:

public function beforeFilter(Event $event) {
    parent::beforeFilter($event);
    $this->set('schema', $this->loadModel()->getSchema());
}

控制器应扩展AppController。如果您需要视图中的架构,那么AppController::beforeFilter可以完成在控制器中查找该架构所需的所有工作,并将其设置为视图可以使用的$schema变量。类似的内容未经测试,但应该非常接近:

public function beforeFilter(Event $event) {
    parent::beforeFilter($event);
    $this->set('schema', $this->loadModel()->getSchema());
}

因此,您的问题实际上不是如何获取与控制器关联的表,而是如何从代码的其他部分访问控制器?你的问题是当前控制器,这听起来好像你已经在控制器中了。这段代码运行的上下文是什么?那么简单地从控制器中传递名称(即将其设置为视图变量)如何?或者甚至将整个表对象作为视图变量向下传递?或者更好的是,告诉我们您在视图中实际想要对该表对象做什么?我觉得我们可以在这里解决一个xy问题。你指的是在哪里以及如何解决?把解释放在哪里?如果您只需要视图中的名称,那么在AppController::beforeFilter中将其设置为视图变量可能是一个好方法。如果您需要访问表以获取视图中的某些内容,这是您的设计有缺陷的一个好迹象;视图通常不应该直接处理表。因此,您的问题实际上不是如何获取与控制器关联的表,而是如何从代码的其他部分访问控制器?你的问题是当前控制器,这听起来好像你已经在控制器中了。这段代码运行的上下文是什么?那么简单地从控制器中传递名称(即将其设置为视图变量)如何?或者甚至将整个表对象作为视图变量向下传递?或者更好的是,告诉我们
您到底想在视图中处理该表对象吗?我觉得我们可以在这里解决一个xy问题。你指的是在哪里以及如何解决?把解释放在哪里?如果您只需要视图中的名称,那么在AppController::beforeFilter中将其设置为视图变量可能是一个好方法。如果您需要访问表以获取视图中的某些内容,这是您的设计有缺陷的一个好迹象;视图通常不应该直接处理表。您可以使用loadModel而不使用任何参数来检索默认模型实例,它将自动处理插件。太棒了!更新了答案以反映这种更简单的方法。您可以使用loadModel而不使用任何参数来检索默认模型实例,它将自动处理插件。太棒了!更新了答案,以反映这一更简单的实现方法。