2009-11-12 136 views
8

我正在使用CakePHP 1.2,我只是想知道是否有任何副作用將$ this-> data傳遞給Controller的視圖。

例:代替

// inside PostsController, I have this code: 
$this->data['Posts'] = $this->Post->find('all'); 

$posts = $this->Post->find('all'); 
$this->set(compact('posts')); 

// inside the /posts/view, I access it like this: 
<?php foreach ($this->data['Posts'] as $post) {....};?> 

通過這樣做,我跳過了這 - $>設置()從控制器都在一起。這是否違反了我可能忽略的任何MVC模式或任何安全問題?我看到使用Auth Component,$ this-> data包含[_Token]數組。

由於

回答

14

您需要了解Cake Helpers自動查找數據的不同位置,因爲這是真正的區別。表格助手將根據$this->data的內容自動填寫字段。這就是表單數據在驗證失敗時依然存在的原因。 OTOH,<select>元素選項陣列自動從複數字段名稱
如果已設置,$form->select('Model.foo_id')將採用$foos的選項。

因此,$this->data有其特殊的地方,不應該輕易使用,正如命名變量有其用途,不應忽視。根據情況使用兩者。如果您不想自動設置Form Helper內容,您的變量爲set()。恕我直言,它也更易於分配一個變量名稱,暗示其包含的數據。在$this->data上運行的所有視圖都不如在$foo上運行的一個視圖和$bar上的另一個視圖清晰。

3

$controller->data是指用於發佈到從視圖文件中的控制數據。

$view->data用於一般數據。

我會避免這樣做,讓自己保持理智。除此之外,您還可以輸入更多信息。

+1

我用質樸的多德同意 - 這 - $>數據,其中$這是一個模型,控制器,視圖或其他對象,我想應該是在DB從形式發佈或從記錄中讀取數據。 我認爲你的版本可讀性差得多,並且違背了其他人習慣的慣例,使得它的可移植性差得多。 但是如果你真的想保存一行: $ this-> set('posts',$ this-> Post-> find('all')); – neilcrookes 2009-11-12 20:38:13

2

除了使用表單時,沒有什麼好的理由直接設置$ this-> data。

爲什麼打破約定 - 控制器:設置是有原因的。如果您想將數據傳遞給視圖以用於顯示或顯示邏輯,則應該使用提供的功能,而不是試圖爲非預期目的共同選擇Controller:數據。

如果遵循規則並按照預期的正確方式執行操作,那麼CakePHP中的所有內容都會更加容易。

2

cakephp版本2 *,當您嘗試設置$this->data

7

在CakePHP 2.X你應該,如果不是純$this->data使用$this->request->data,否則你可能最終得到這個錯誤數據時出現錯誤:

Indirect modification of overloaded property View::$data has no effect

相關問題