【问题标题】:undersanding CakePHP's controller了解 CakePHP 控制器
【发布时间】:2013-04-08 01:47:35
【问题描述】:

我正在阅读 CakePHP 的初学者教程,我有一个问题:

在博客教程中,已经在Controller中创建了以下函数

public function index() {
    $this->set('posts', $this->Post->find('all'));
}

我试图更好地理解这意味着什么,具体来说

$this->Post->find('all')

这是对 Controller 对象的 Post 对象的引用,然后调用它的 find 函数。 这个 Post 对象是 Post 对象的linkedList(或其他一些数据结构)吗?这似乎是唯一有意义的方法,但我想确定一下。我习惯了 Java 中的 OOP 和 PHP 中的 OOP 新手,我认为我可能会遗漏一些内容。

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    您的模型控制数据库访问。因此,当您想要从数据库中获取数据时,在 Controller 中,您需要使用 Model 来检索它。

    $this->Post->find('all');
    

    告诉“帖子”模型检索所有帖子。

    最佳实践实际上是根本不使用控制器中的find() 方法,而是调用在模型中创建的自定义方法。例如:

    //inside PostsController
    $posts = $this->Post->getPosts();
    
    //inside Post Model
    public function getPosts() {
        return $this->find('all');
    }
    

    当您添加条件、限制、订单等时,这通常会变得更加复杂,但这样做,它更接近于 MVC,M(模型)是所有数据检索的对象。 (并且还使您的代码更清晰,因此无论何时您想要更新查找,您只需在一个地方进行,而不是跨多个控制器)

    【讨论】:

    • Best practice is actually to not use the find() method from your Controller at all 这不准确。最佳实践是包装非平凡的逻辑/调用遵循“胖模型,瘦控制器” - find('all') 不适合这个,包装这个调用除了添加抽象和删除功能之外什么都不做(通过消除将参数传递给find 调用)。
    • @AD7six - 我不同意,但我认为这不是重点 - 在应用程序中,您很少会直接使用“findAll()”。即使现在,你认为你只需要一个find('all'),无论如何把它放在模型中,你会很感激 - 稍后,当你决定你需要一个'active'=>1条件(或类似的东西) ,你会希望你的发现都在一个位置。更灵活、更易于更新的代码比担心添加抽象层更重要。
    • @AD7six - 我没有,但我猜你现在提到了:) 我们必须同意不同意。随意放 20+ find('all')s throughout your Controllers. I'll have mine all call a Model's method. When time comes where you need to add additional parameters, have fun going through them all. Granted, as I pointed out above, your reasoning for this being "not accurate" is assuming anyone actually uses a straight-up find('all')`,我很少看到。
    • 底线 IMO,对于初级/中级 Cake 开发人员来说,将所有 find() 放入模型中仍然是一个很好的建议。当他们变得更有经验并了解如何/何时可能不需要这样做时,他们就会有更多的权力。 :)
    【解决方案2】:

    它调用模型 Post 的方法 find。 您的模型已经找到,因为它扩展了 AppModel。

       App::uses('AppModel', 'Model');
      class Post extends AppModel {
            public $name = 'Post';
        }
    

    返回会是这样的

    (它唯一的例子,它将取决于你的数据库和你的模型帖子/用户......等)

    Array
    (
        [Post] => Array
            (
                [id] => 83
                [desc] => 'it is a test post'
                [user_id] => 2
    
            )
    
        [user] => Array
            (
                [id] => 2
                [name] => 'rafael'
                [phone] => '9999-000'
            )
    )
    

    这个数组将负责你在变量“posts”中的视图访问。

    【讨论】:

    • 我在我的问题中的意思是 - Post 类(来自 AppModel 的扩展)实际上是否具有查找所有帖子的功能?从 OOP 的角度来看,给类一个函数来查找其类型的所有实例是否正确?似乎“查找”函数不应该进入 Post 类,而是控制器应该创建一个 Posts 数组,在控制器中创建一个查找函数。
    • @user1015214 'all' 参数只是一种检索数据的方法。有几种方法可以获取它们,例如'list''threaded''first'find() 方法也将一个可以包含多个条件的数组作为第二个参数。这些被解释为SQL 子句。所以你只根据你的条件来获取你的数据。 'all' 表示检索到的数据的组织方式
    猜你喜欢
    • 2013-01-05
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2013-10-14
    • 1970-01-01
    • 2013-09-19
    • 2012-08-09
    相关资源
    最近更新 更多