簡體   English   中英

如何在不破壞CakePHP的MVC框架的情況下做到這一點?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM