[英]How can I do this without breaking the MVC framework in CakePHP?
對不起,通用標題是什么。 我不是最好的頭銜。
無論如何,Cake傳遞數據(作為散列)的方式幾乎是我什至需要問這個問題的原因。 如果當我從控制器向視圖傳遞變量/ obj時,它是我可以詢問的對象(即$ duck-> quack()),而不是讓它成為數組/字典(即$ duck [') Duck'] ['quack'] == true),這很容易。
我的應用程序中包含用戶x可以擁有或不可以擁有的項目的列表。 在某些視圖中,我顯示數據庫/應用程序中的所有項目(即分頁),對於每個項目,我需要知道登錄用戶是否擁有它。 為了回答這個問題,我需要進行查詢(由於復雜的HABTM關系),該查詢在模型內部完成。 換句話說,我的Item模型具有一個函數isOwnedByUser($ user_id,$ item_id),如果該函數歸用戶所有,則為true。 我想從視圖中調用此函數。
自然,這違反了MVC框架,但是我不確定還有其他方法。 我有四個想法:
想法1:
在助手中執行此操作:
App:Import('Model','Item');
$item = new Item();
$item->isOwnedByUser($user_id,$item_id);
並從視圖中調用幫助程序(並傳入$ item_id和$ user_id)。 但這確實違反了MVC框架。
想法2:
在item_controller.php中創建一個動作,並使用requestAction()從視圖中調用該動作。 但是我聽說這是非常無效的
現在,當我在尋找問題的解決方案時發現了這兩個想法,但根據他們的看法,這兩個想法很糟糕,因此我又提出了兩個解決方案:
理念3:
將分頁數據返回到視圖時,我可以確保所有項目都具有“ user_id”鍵,以便可以對照已登錄用戶的ID檢查視圖中的鍵,以查看他/她是否擁有該項目。 但這將要求a)我重新編寫分頁b)非常丑陋的查詢,尤其是對於某些視圖(搜索),c)整體丑陋和緩慢。 所以我決定放棄這個想法
理念4:
每當視圖需要知道某個項目是否歸用戶所有時,我都會從控制器中傳遞另一個數組,該數組包含用戶擁有的所有項目,在視圖中,您可以使用in_array()來檢查用戶是否擁有說的項目。 當然,問題很明顯:如果用戶有很多物品怎么辦?
簡而言之,我對此一無所知,不知道從這里到哪里去,我將不勝感激! 謝謝!
我將3和4結合在一起。
在您獲得所有分頁項目后的操作:
$items = $this->paginate('Item');
獲取他們的ID並將其與用戶ID結合起來以獲取所有用戶的商品。
$itemIds = Set::extract('/Item/id', $items);
$usersItems = $this->Item->User->find
(
'all',
array
(
'conditions' => array
(
'User.id' = $userId,
'Item.id' => $itemIds
),
'fields' => array('User.id', 'Item.id')
)
);
現在,您可以按照自己喜歡的格式設置$ usersItems,並為視圖設置它和$ items。 這將帶您進入選項4和in_array(),但它可能是Set :: extract()或Set :: check()。
這樣的事情應該做到:
if (Set::extract(sprintf('/Item[id=%s]', $itemId), $usersItems))
{
// user has the item
}
(我是從我的記憶中寫出來的,所以...您知道如果失敗了該怎么辦:))
編輯:
或者,您可以執行以下操作(它應該比上述速度更快,只需確保將Set::extract()
移出循環即可):
$usersItemIds = Set::extract('/Item/id', $usersItems);
if (in_array($itemId, $usersItemIds))
{
// user has the item
}
我知道這是一個老問題,但似乎ACL組件在這里可能是一個不錯的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.