我正在开发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
如何解决这个问题?
答案 0 :(得分:5)
仅仅基于Thorpe Obazee的回答和我的评论,最好将权限管理构建为控制器组件,而不是控制器组件。如前所述,你真的不应该从控制器调用控制器 - 这违反了MVC的原则(反过来是CakePHP)。
组件可以打包在插件中。如果您的插件被调用Permissions
而您的组件也被称为Permissions
,那么您的目录结构将如下所示:
当您加载插件时,您可以在核心应用程序的控制器中使用此组件作为任何其他组件,只需使用插件语法:
<?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