组件-CakePHP中的访问控制器变量


Access Controller variable from Component - CakePHP

我正在使用一个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之间的关系,UploadsCoontroller是插件的一部分。是什么实例化了插件中的UploadsController?这是自动发生的吗?

有人能帮忙吗?

谢谢,Ken

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

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

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

app/controllers/components/test.php

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

app/controller/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(

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

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

如果您的控制器中有一个名为$fooVariable的变量,您将在相关组件中访问它,如下所示:$this->getController()->myVariable

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