cakephp调用插件控制器


cakephp call a plugin controller

我正在cakephp中开发一个插件。我在Plugin/Permissions/Controller 内部创建了一个名为PermissionsController.php的控制器

此控制器扩展了同一目录中的另一个控制器:PermissionManagerAppController.php

我想知道如何从另一个控制器(如UsersController.php )调用插件内部的函数

这是我的插件控制器,现在是空的:

class PermissionsController extends PermissionManagerAppController {
    public $uses = array('PermissionManager.Permission');
    public function index() {
    }
    public function test($string) {
        echo'<p>TEST: '.$string.'</p>';
    }
}

我想从另一个控制器调用动作测试
我试过这个:

App::uses('Permissions', 'PermissionsController.Controller');
class UsersController extends AppController {
    public $name = 'Users';
    public $scaffold;
    public function beforeFilter () {
        parent::beforeFilter(); 
        $permissions = new Permissions();
        $permissions->test('test');
       }
}

我也试过

App::uses('Permissions', 'Permissions.Controller');

总是给我这个错误:

Fatal error: Class 'Permissions' not found

我试过:

$this->permissions->test('test');

我检索到这个错误:

Fatal error: Call to a member function test() on a non-object 

如何解决这个问题?

在Thorpe Obazee的回答和我的评论的基础上,最好将权限管理之类的东西构建为控制器组件,而不是控制器本身。如上所述,您真的不应该从控制器调用控制器——这违背了MVC的原则(反过来也违背了CakePHP)。

组件可以封装在插件中。如果你的插件名为Permissions,而你的组件也被称为Permissions,那么你的目录结构应该是这样的:

  • 应用程序
    • 插件
      • 权限
        • 控制器
          • 组件
            • PermissionsComponent.php

当你加载插件时,你可以在核心应用程序的控制器中使用这个组件作为任何其他组件,只需使用插件语法:

<?php
class UsersController extends AppController {
    public $components = array(
        'Permissions.Permissions'
    );
}

插件中的实际组件如下所示:

<?php
App::uses('Component', 'Controller');
class PermissionsComponent extends Component {
    public function checkPermission() {
        // code...
    }
}

然后,您可以像调用核心组件方法一样调用任何组件方法:

<?php
class UsersController extends AppController {
    public $components = array(
        'Permissions.Permissions'
    );
    public function beforeFilter() {
        $this->Permissions->checkPermission();
    }
}

希望这能有所帮助。

我建议您将功能提取到组件中,以便在控制器之间共享功能。

<?php
App::uses('Component', 'Controller');
class TestingComponent extends Component {
    public function sayTesting($email) {
         return '<p>TEST: '.$string.'</p>';
    }
}

更新:要将其添加到控制器,

public $components = array('Testing');

然后从控制器方法:

public function foobar() {
    $word = $this->Testing->sayTesting();
}

只是添加另一个注释。我还注意到"/app/Plugin"中的子文件夹必须具有正确的权限(chmod 755)。否则,Cakephp将无法找到/加载插件。

如果你在ubuntu上,只需发送下面的命令。记住也要为您的子文件夹执行此操作!

chmod 755 /app/Plugin/YOUR_PLUGIN_NAME

有关chmod的更多信息,请点击此处:将目录的所有文件和文件夹权限更改为644/755