【问题标题】:Access Controller variable from Component - CakePHP来自组件的访问控制器变量 - CakePHP
【发布时间】:2014-05-15 21:16:47
【问题描述】:

我正在使用 CakePHP 的插件 - AjaxMultiUpload(一个很好的插件 :-) - 但我有一个关于如何更改/访问作为插件一部分的控制器中定义的变量的问题。

我以前用过这个插件,很喜欢。但是我试图根据我将组件附加到哪个控制器来限制允许上传的文件类型。

在插件中有一个控制器 - UploadsController.php。在这个类中,有一个公共变量:

// list of valid extensions, ex. array("jpeg", "xml", "bmp")
public $allowedExtensions = array();

如果我将其更改为:

public $allowedExtensions = array('mp3');

当我尝试上传 .jpg 文件时,会发出一条错误消息(正如人们所希望的那样 :-)。

在我的控制器(轨道)中,我附加了 AjaxMultiUpload 插件。有用。在我的 Tracks 控制器的 beforeFilter() 方法中,我放置了以下行:

$this->Upload->allowedExtensions = array('mp3');

这没有效果。 (顺便说一句,没有任何警告告诉我我试图访问不存在的东西)。

我不想通过在插件的控制器中硬编码来更改数组 allowedExtensions 的内容。这很糟糕,原因有两个:1)插件的可更新性和 2)我想根据我的哪个控制器(轨道、图像等)插件更改限制(例如,音频文件类型与图像文件类型)附在上面。

我不明白的是组件(附加到 Tracks 控制器)和作为插件一部分的 UploadsController 之间的关系。什么实例化了作为插件一部分的 UploadsController?这会自动发生吗?

谁能帮忙?

谢谢, 肯

【问题讨论】:

    标签: php cakephp cakephp-2.3


    【解决方案1】:

    您可以在 CakePhp 3.x 中获取组件的控制器,如下所示:

    $objController = $this->_registry->getController();

    【讨论】:

      【解决方案2】:

      组件的访问与从控制器访问 Cake 中的模型相同。我创建了一个测试组件,并将其包含在主应用程序的控制器和插件的控制器中:

      app/controllers/components/test.php

      class TestComponent extends Object {
          public $allowedExtensions = array(); // put your defaults in the component
      }
      

      app/controllers/my_controller.php

      class MyController extends AppController {
          // ... vars
          var $components = array('Test', /* ...others */);
          var $layout = '';
      
          public function test() {
              $this->render(false);
      
              // get current values from component
              debug($this->Test->allowedExtensions);
      
              // add a JPG
              $this->Test->allowedExtensions[] = 'jpg';
              debug($this->Test->allowedExtensions);
      
              // add a MP3
              $this->Test->allowedExtensions[] = 'mp3';
              debug($this->Test->allowedExtensions);
          }
      }
      

      这个测试的输出是:

      app\controllers\my_controller.php(第 n 行)数组()

      app\controllers\my_controller.php(第 n 行)数组( [0] => jpg )

      app\controllers\my_controller.php(第 n 行)数组( [0] => jpg [1] => mp3)

      因此,您可以从中看到 Test 组件的公共属性可从任何使用它的控制器获得。

      使用完全相同的方法来包含主项目中的组件(插件特定模型、组件等需要以插件名称为前缀)产生相同的结果,实际上您可以从插件或任何插件中控制该组件属性单独的控制器,并且在它自己的组件中仍然具有您的默认值。

      【讨论】:

      • 我知道如何访问组件。那不是我的问题。类变量 allowedExtensions 不是组件类的一部分。它在作为插件一部分的控制器中声明。我不知道那个 Controller 是如何被实例化的,在什么情况下我可以修改它的值?
      【解决方案3】:

      如果您的 Controller 中有一个名为 $fooVariable 的变量,您可以在关联的组件中访问它,如下所示:$this->getController()->myVariable。

      请注意,该变量需要在控制器中公开。如果变量是受保护的或私有的,您可以在加载时将其注入组件中。

      【讨论】:

      • 请查看How do I write a good answer。不鼓励仅使用代码的答案,因为它们没有解释如何解决问题中的问题。您应该更新您的答案以解释它的作用以及如何使用它。
      猜你喜欢
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 2013-01-11
      相关资源
      最近更新 更多