【问题标题】:cakephp call a plugin controllercakephp 调用插件控制器
【发布时间】:2013-11-18 21:55:09
【问题描述】:

我正在开发一个 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 

如何解决?

【问题讨论】:

  • 考虑进行此类调用是不遵循 CakePHP 提出的 MVC 模式的指标。根据您的 test() 方法提供的功能,它可能应该进入组件或模型,或者您应该扩展插件控制器。
  • 好的,但如果我只写一个供应商文件?因为我没有写入数据库。 .还是只制作一个组件更好?我使用了控制器因为我必须进行重定向。 .如何在组件或供应商中做到这一点? @ndm
  • 在不知道您要共享的确切功能的情况下,我无法向您推荐任何东西,您必须展示一些实际代码和/或描述此功能的用途。我现在只能说重定向可以从代码中的任何地方完成(尽管模型真的不应该这样做),所以你不限于控制器,如果功能与 CakePHP 相关并且不与数据库,然后a component可能是要走的路。
  • Weel,代码是一个简单的函数,其中参数是一个数组。在它里面有一个视图和 user_group 列表,在实际 URL 的花瓶中(通过的操作)我检查该用户(在其组中)是否可以访问该页面,如果不能重定向到另一个页面。 @ndm
  • 听起来类似于 ACL 和 auth 组件所做的事情......从您提供的信息来看,我会说组件是要走的路。

标签: php cakephp plugins


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

  • 唯一遗漏的是如何调用 checkPermission 函数,剩下的就是完整的答案谢谢
  • 已更新。您可以像调用核心组件的方法一样调用插件组件的方法。
  • 完美,我认为这个答案对于我的范围来说非常完整,我没有使用过组件,因为我认为插件不能只是一个组件,并且我已经创建了一个控制器和插件之后..
  • 没有。插件可以尽可能少或尽可能完整,无论哪种方式都没有限制。我有很多插件,它们只是视图助手、模型行为或控制器组件。
  • 没问题。祝您的 CakePHP 项目一切顺利!
【解决方案2】:

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

<?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();
}

【讨论】:

  • $this-&gt;components = array('Permissions.Permissions')'; 假设你的插件被称为Permissions 并且你的组件也被称为Permissions
  • 谢谢,我已经看到了,这将是一个很好的解决方案,您建议在插件中使用控制器或模型,并且该组件可以很好地管理还是没有必要?
【解决方案3】:

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

如果您使用的是 ubuntu,只需发送以下命令。记住也要为您的子文件夹执行此操作!

chmod 755 /app/Plugin/YOUR_PLUGIN_NAME

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多