【问题标题】:Extending Controller for common functionalities为常用功能扩展控制器
【发布时间】:2014-11-02 01:20:00
【问题描述】:

我正在处理一个 CakePHP 项目,我意识到我的很多控制器都有几乎相同的代码。我决定我应该尝试制作一种“BaseController”并让其他控制器扩展它......就像这样:

class BaseController extends AppController {

    public $components = array(
        'RequestHandler'
    );

    public function get($param = "all", $value = "") {
        $this->layout = 'ajax';
        if($param == "all") {
            $data = $this->Base->find('all');
        }  elseif ($param == "id") {
            $data = $this->Base->findById($value);
        } else {
            ...
        }
    }

    ...
}

但此时我迷路了。我确实想要一个 Base 数据库表和模型...我只是想要一些东西,这样就不必多次编写几乎相同的 get() 方法...然后让假设我制作了一个扩展此控制器的控制器“FooController”......我如何制作它以便 get() 现在与 Foo 模型/表交互?

我认为有一种 Cake 方式可以做到这一点,而不是有大量重复的代码......但我一直没能找到它。

【问题讨论】:

  • 嗨@mcgowan.b,我正在documentation 中寻找组件。我没有看到一种可以使用它来处理各种模型的数据库的方法,我错过了什么吗?
  • 手册上写着Components are packages of logic that are shared between controllers,这是您希望实现的,所有控制器都可以使用的通用功能。 manual
  • @mcgowan.b,是的,但我不是在谈论任何逻辑,我希望有一段代码可以处理各种模型的表操作(选择、更新、删除。 .)

标签: php cakephp


【解决方案1】:

$data = $this->{$this->modelClass}->find('all'); 应该可以解决问题http://api.cakephp.org/2.4/source-class-Controller.html#268-276

【讨论】:

    【解决方案2】:

    假设您想用 Foo 模型替换 Base,我个人会将模型名称作为参数传递:

    public function get($param = 'all', $value = '', $model = 'Foo')
    {
        $this->layout = 'ajax';
    
        if($param == 'all') {
            $data = $this->{$model}->find('all');
        } elseif ($param == 'id') {
            $data = $this->{$model}->findById($value);
        }
    }
    

    对 cake 不够熟悉,无法提供更好的解决方案,在调用 find 之前检查模型是否存在可能不会有什么坏处。

    如果这与 CakePHP 方法不符,请见谅。

    【讨论】:

    • 虽然我可以看到这是如何工作的,但似乎仍然需要我在 Foo 控制器(和其他控制器)中拥有所有这些函数,这些函数只调用上面的相关函数。
    • 我明白了,看来您首先需要一个可扩展模型,然后。我想当我看到“Base”时,我认为 Foo 模型已经在扩展提供 findBy 函数的模型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2017-11-19
    • 2018-11-21
    • 2022-01-09
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多