了解CakePHP';s控制器

了解CakePHP';s控制器,php,cakephp,Php,Cakephp,我正在学习CakePHP初学者教程,我有一个问题: 在博客教程中,用户在控制器中创建了以下函数 public function index() { $this->set('posts', $this->Post->find('all')); } 我正试图更好地理解这意味着什么,特别是 $this->Post->find('all') 这是对控制器对象的Post对象的引用,然后调用其查找函数。 此Post对象是Post对象的linkedList(或其他数据

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

在博客教程中,用户在控制器中创建了以下函数

public function index() {
    $this->set('posts', $this->Post->find('all'));
}
我正试图更好地理解这意味着什么,特别是

$this->Post->find('all')
这是对控制器对象的Post对象的引用,然后调用其查找函数。
此Post对象是Post对象的linkedList(或其他数据结构)吗?这似乎是唯一有意义的方法,但我想确定一下。我已经习惯了Java中的OOP和PHP中的OOP,我想我可能缺少了一些东西。

它调用了一个方法
查找您的模型帖子。
您的模型已找到,因为它扩展了AppModel

   App::uses('AppModel', 'Model');
  class Post extends AppModel {
        public $name = 'Post';
    }
我会是这样的

(这是唯一的例子,它将取决于您的数据库和您的模型post/用户…等)


并且这个数组可以在变量“posts”中为您的视图访问权限进行分配。

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

$this->Post->find('all');
告诉“Post”模型检索所有Post

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

//inside PostsController
$posts = $this->Post->getPosts();

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

当您添加条件、限制、订单等时,这通常会变得更加复杂,但这样做,它更接近MVC,M(模型)是所有数据检索的基础。(同时也使代码更简洁,因此,每当您想要更新查找时,您只需在一个位置执行,而不需要跨多个控制器)

我在问题中的意思是-Post类(从AppModel扩展而来)是否实际获得了查找所有帖子的函数?从OOP的角度来看,给类一个函数来查找其类型的所有实例是否正确?似乎“find”函数不应该进入Post类,而是控制器应该创建一个Post数组在控制器中创建一个find函数。@user1015214
'all'
参数只是一种检索数据的方法。有几种方法可以获取它们,例如
'list'
'threaded'
'first'
find()
方法还将包含许多条件的数组作为第二个参数。这些被解释为
SQL
子句。因此,您只能根据您的条件获取数据
'all'
表示检索到的数据的组织方式
最佳做法实际上是根本不使用控制器中的find()方法
这是不准确的。最佳实践是包装遵循“胖模型、瘦控制器”的非琐碎逻辑/调用-
find('all')
不符合此要求,包装此调用只会添加抽象,并删除功能(通过删除向find调用传递参数的可能性)。@AD7six-我不同意,但我认为这与问题无关——在应用程序中,很少有人会直接使用“findAll()”。即使现在,你认为你只需要一个
查找('all')
,不管怎么说,把它放在模型中,你也会心存感激-稍后,当你决定需要一个
'active'=>1
条件(或类似条件)时,你会希望你的查找都在一个位置。更灵活、更容易更新的代码比担心增加抽象层更重要。@AD7six-我不知道,但我猜现在你提到:)我们必须同意不同意。您可以在控制器中随意放置20多个find('all')
s。我会让我所有的调用一个模型的方法。当您需要添加额外参数时,请享受查看所有参数的乐趣。诚然,正如我上面指出的,你认为这是“不准确”的理由是假设任何人实际上使用了一个直接的
find('all')`,我很少看到这种情况。在我看来,底线是,对于初级/中级蛋糕开发人员来说,将所有find()放在模型中仍然是一个很好的建议。当他们变得更有经验并学会如何/当他们可能不需要这样做时,他们就会拥有更多的权力
//inside PostsController
$posts = $this->Post->getPosts();

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