2013-04-15 86 views
0

我經歷的CakePHP的新手教程,我有一個問題:undersanding CakePHP的控制器

在博客教程中,已經創造了控制器

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

我想下面的函數更好地理解這意味着什麼,具體來說

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

這是對Controller對象的Post對象的引用,然後調用它的find函數。 這個Post對象是Post對象的linkedList(或其他一些數據結構)嗎?這似乎是唯一的方法,但我想確保。我習慣於Java中的OOP和PHP中OOP中的新手,並認爲我可能會缺少一些部分。

回答

1

Your Model控制數據庫訪問。所以,當你需要數據庫中的數據時,在你的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(模型)是什麼呢所有的數據檢索。 (並且使代碼更加清晰,所以無論何時你想更新查找,你只需要在一個地方完成,而不是跨越多個控制器)

+0

'最好的做法實際上是不使用你的Controller的find()方法'這是不準確的。最好的做法是包裝遵循「胖模型,瘦控制器」的非平凡邏輯/調用 - find('all')不適合這個,包裝這個調用除了添加抽象和刪除功能外,將參數傳遞給find調用的可能性)。 – AD7six

+0

@ AD7six - 我不同意,但我認爲這不重要 - 很少在應用程序中使用'findAll()'。即使現在,你認爲你只需要一個'find('all')',無論如何把它放在模型中,你會感激 - 後來,當你決定需要一個''active'=> 1'條件(或類似的東西),你會希望你的發現都在一個單一的位置。更加靈活,易於更新的代碼比擔心添加抽象層更重要。 – Dave

+0

@ AD7six - 我不知道,但現在我猜你提到了:)我們必須同意不同意。隨意在您的控制器中放置20個以上的(全部)。我會讓我的所有人都稱之爲模型的方法。當時間到了需要添加額外參數的地方時,盡情享受它們。誠然,正如我上面指出的那樣,你對這種「不準確」的推理是假設任何人實際上都使用直接的find('all')',而我很少看到它。 – Dave

0

它調用您的模型Post的方法find。你的模型找到了 ,因爲它擴展了AppModel。

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

,並返回會是這樣的

(其唯一的例子,它會依賴烏爾數據庫和UR模式後/用戶...等)

Array 
(
    [Post] => Array 
     (
      [id] => 83 
      [desc] => 'it is a test post' 
      [user_id] => 2 

     ) 

    [user] => Array 
     (
      [id] => 2 
      [name] => 'rafael' 
      [phone] => '9999-000' 
     ) 
) 

這陣LL在變量'帖子'中爲您的觀點提供幫助。

+0

我在我的問題中的含義是 - Post類(from它從AppModel的擴展)實際上得到函數來查找所有帖子?從OOP的角度來看,它是否正確給類提供了一個函數來查找其類型的所有實例?看起來,'find'函數不應該進入Post類,而是Controller應該創建一個Posts數組,在控制器中創建一個find函數。 – user1015214

+0

@ user1015214「all''參數,只是一種檢索數據的方法。有幾種方法可以獲取它們,比如「list」,「threaded」,「first」等。 find()方法也可以作爲第二個參數,該數組可以包含許多條件。這些被解釋爲'SQL'子句。所以你只能根據你的條件獲取你的數據。 ''all''表示檢索到的數據的組織方式 –