我正在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