2017-02-20 36 views
0

我有兩個(2)班:TYPO3 extbase:獲取父對象模型對象

Person模型類

<?php 

class Person extends BaseDto 
{ 
    /** 
    * @var array|PostalAddress 
    */ 
    protected $postalAddresses = array(); 

    /** 
    * @param array|PostalAddress $postalAddresses 
    */ 
    public function setPostalAddresses($postalAddresses) 
    { 
     $this->postalAddresses = $postalAddresses; 
    } 

    /** 
    * @return array|PostalAddress[] 
    */ 
    public function getPostalAddresses() 
    { 
     return $this->postalAddresses; 
    } 
} 

的PostalAddress模型類

<?php 

class PostalAddress 
{ 
    /** 
    * @var string $privatePersonFirstName 
    */ 
    protected $privatePersonFirstName; 

    /** 
    * @var string $privatePersonName 
    */ 
    protected $privatePersonName; 

    /** 
    * @return string 
    */ 
    public function getPrivatePersonFirstName() 
    { 
     return $this->privatePersonFirstName; 
    } 

    /** 
    * @param string $privatePersonFirstName 
    */ 
    public function setPrivatePersonFirstName($privatePersonFirstName) 
    { 
     $this->privatePersonFirstName = $privatePersonFirstName; 
    } 

    /** 
    * @return string 
    */ 
    public function getPrivatePersonName() 
    { 
     return $this->privatePersonName; 
    } 

    /** 
    * @param string $privatePersonName 
    */ 
    public function setPrivatePersonName($privatePersonName) 
    { 
     $this->privatePersonName = $privatePersonName; 
    } 
} 

在控制器PostalAddressConroller我已經有一個動作創建了編輯單個地址的表單。

我想使某些字段只有在滿足某些條件時纔可編輯。示例:地址上的組織字段只能在個人爲私人類型,地址類型爲僱主的情況下可編輯。

要實現這樣的條件檢查,我想在PostalAddress模型上創建一個方法。但爲此,它需要有一個引用返回到控制器內的父對象。

我想避免將所有的邏輯放在模板中,以保持模板清晰易懂。

是否支持extbase級別的反向引用?

如果我必須自己實現這樣的反向引用:如何防止循環引用(例如對象序列化)?

+0

我將不同的方式處理這個問題。這不是控制器工作恕我直言。這是一個**模板**作業。如果模板中的條件顯示正確的佈局(字段可編輯或不),我會使用它。之後,您必須確保沒有人能夠通過開發人員工具讓字段可編輯。即'if($ model-> isAllowedProperty){AddFieldToResultArrOrSimilar}' – Xatenev

+0

我同意Xatenev在這裏。這屬於它在模板中的區別。 – j4k3

+0

@Xatenev你可以創建一個答案嗎? –

回答

0

我會以不同的方式處理問題。這是no controller job imho。這僅僅是模板/查看作業。如果模板中的條件顯示正確的佈局(字段可編輯或不),我會使用它。之後,您必須確保沒有人能夠通過開發人員工具讓字段可編輯。

這將是通過在後端邏輯添加條件,例如可實現的:

if($model->isAllowedProperty) { AddFieldToResultArrOrSimilar() } 
0

據我瞭解MVC模式,該模型應該只攜帶數據,沒有邏輯和任何類型的依賴。 因此,爲了解決您的問題,我將使用兩個不同的模型類,基於同一個表,僅將那些適用於特定模型的合適的元素和驗證元數據進行調整。

試想低於兩種型號:

namespace Acme\MyPlugin\Domain\Model; 
class PostalAddressPrivate 
{ 
    /** 
    * @var string $privatePersonFirstName 
    */ 
    protected $privatePersonFirstName; 

    /** 
    * @var string $privatePersonName 
    */ 
    protected $privatePersonName; 

    [...] 

} 

namespace Acme\MyPlugin\Domain\Model; 
class PostalAddressCommercial 
{ 
    /** 
    * @var string $privatePersonFirstName 
    */ 
    protected $companyName; 

    [...] 

} 

現在你必須告訴持久層,這些模型去同一個表。您可以在該插件的輸入框設置中執行此操作。

plugin.tx_myplugin { 
    persistence { 
     classes { 
      Acme\MyPlugin\Domain\Model\PostalAddressPrivate { 
       mapping { 
        tableName = tx_myplugin_domain_model_postal_address 
       } 
      } 
      Acme\MyPlugin\Domain\Model\PostalAddressCommercial { 
       mapping { 
        tableName = tx_myplugin_domain_model_postal_address 
       } 
      } 
    } 
} 

現在,您可以將邏輯傳輸到控制器並決定使用哪種型號。您可以使用通用接口或抽象類來擴展此簡單案例,等等。

在控制器中的這種「選擇正確的模型」邏輯有時可能有點棘手。一般來說,您需要在適當的「initializeXxxAction」方法內放置一些處理extbase「屬性映射器」的代碼。 在開始時,我受到了德語文章的啓發(對於舊版本的extbase!):https://jweiland.net/typo3/codebeispiele/extension-programmierung/extbase-dynamische-validierung.html 希望谷歌翻譯會給你一些提示,以解決upcomming問題。

最重要的是,您可以通過一些前端工作來協助基於服務器的驗證和處理。例如。 JavaScript技巧根據所選的私有/商業狀態來啓用或禁用特定的字段。 您還可以調整流體模板來渲染/不渲染某些部分,具體取決於控制器中使用的模型變體。

+0

然後你完全誤解了MVC模式。 Theres在模型中沒有任何錯誤的邏輯和依賴關係。如果在這種情況下,數據嚴格限於實體的實例,那麼它就是域邏輯。該模型正是和唯一的地方ist屬於。胸圍不要拿我的話:http://softwareengineering.stackexchange.com/questions/176639/why-put-the-business-logic-in-the-model-what-happens-when-i-have-multiple-類型 – j4k3

+0

OK j4k3,你是對的。也許我不應該使用術語「模型」,而是使用「實體」,因爲這就是我的意思。根據我的經驗,將所有應用程序邏輯從實體中提取出來是更清潔和更安全的。一個實體經理類ehich也將成爲模型層的一部分,這也許就是你的意思。在Symfony中,例如每次我試圖欺騙一些外部依賴到實體類中(因爲它有時非常方便),遲早我遇到了「循環依賴問題」,所以我會堅持我的習慣,只將實體保留爲值對象。 –