cakephp调用一个插件控制器

时间:2013-11-18 21:55:10

标签: php cakephp plugins

我正在开发cakephp中的一个插件。 我在PermissionsController.php

中创建了一个名为Plugin/Permissions/Controller的控制器

此控制器将另一个控制器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 

如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

仅仅基于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();
    }
}

希望这有帮助。

答案 1 :(得分:1)

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

<?php

App::uses('Component', 'Controller');

class TestingComponent extends Component {

    public function sayTesting($email) {
         return '<p>TEST: '.$string.'</p>';
    }
}

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

public $components = array('Testing');

然后从Controller方法:

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

答案 2 :(得分:0)

只是添加另一张便条。我还注意到&#39; / app / Plugin&#39;中的子文件夹必须拥有正确的权限(chmod 755)。如果没有,Cakephp将无法找到/加载插件。

如果您使用的是ubuntu,请发送以下命令。请记住也为您的SUB-FOLDERS做这个!

chmod 755 /app/Plugin/YOUR_PLUGIN_NAME

有关chmod的更多信息:Change all files and folders permissions of a directory to 644/755