2015-07-19 89 views
0

原始Github上問題的工作:https://github.com/zfcampus/zf-apigility-doctrine/issues/215與相關/嵌入實體

在代碼連接API,包括三個實體各自的服務:地點,產品和位置。

地點與地點一個多對一關係

/** 
    * @ORM\ManyToOne(targetEntity="Db\Entity\Location", cascade={"persist"}) 
    * @ORM\JoinColumn(name="location_id", referencedColumnName="id") 
    * 
    * @var Db\Entity\Location $location 
    */ 
    protected $location; 
    public function getLocation() {...} 
    public function setLocation($location) {...} 

場館與產品多對多關係

/** 
* @ORM\ManyToMany(targetEntity="Db\Entity\Product", inversedBy="venues", cascade={"persist"}) 
* @ORM\JoinTable(name="products_venues") 
**/ 
protected $products; 
public function getProducts() {...} 
public function setProducts($products) {...} 
public function addProduct(Product $product) 
{ 
    $product->addVenue($this); 
    $this->products[] = $product; 

    return $this; 
} 

和產品有場地多對多關係現在

/** 
* @ORM\ManyToMany(targetEntity="Db\Entity\Venue", mappedBy="products", cascade={"persist"}) 
**/ 
protected $venues; 
public function getVenues() {...} 
public function setVenues($venues) {...} 
public function addVenues($venue) 
{ 
    $this->venues[] = $venue; 

    return $this; 
} 

,我有兩個問題在這裏: 1)我可以創建一個新的場地像這樣的位置信息:

POST /venues 
{ 
    . 
    . 
    . 
    "location":{ 
     "address":"123 Fake Street", 
     "city":"cityTest", 
     "country":"CountryTest", 
     "postalCode":"12345" 
    } 
} 

和一個新的場地是一個新的位置註冊表中創建,並同時看到正確鏈接,當我剛剛創建的場所。 當我剛剛創建了場地Id時,我發現位置對象的ID在_embedded中,但如果我需要編輯該地址並將場地1與位置2相連接,而不是最初創建的位置1,該怎麼辦?

其次,我無法複製這個過程,產品創建和鏈接產品與場地在同一個POST調用中創建最後一個。 下界想出瞭如何將現有產品添加到特定場所的產品集合中。 那麼,哪種方式更合適? (「1次調用創建並鏈接它們」與「多次創建調用+修補程序調用將它們鏈接在一起」)以及我需要在Apigility + Doctrine中使它們發生的事情?

更新7月20日:

Woo !!這是有趣的發現。爲了更新特定場地的位置,我必須在Venues服務中添加一個新的「位置」字段。 有了這個,我可以將一個位置對象作爲一個額外的屬性和/ Venues所需的屬性一起發佈。或者通過添加location: {"id" : 123}來指定ID(這也適用於PATCH,這正是我一直在尋找的,太棒了!)。但是我意識到沒有實際的驗證來檢查具有指定Id的位置實際上是否存在。如果沒有找到,那麼新場地將被鏈接到「空」位置。 :皺眉:

所以,在那之後,我看到了包含Apigility Doctrine驗證器。 :smile:ZF\Apigility\Doctrine\Server\Validator\ObjectExists驗證我發送的對象實際上存在於數據庫中。 Yeeyyy!我所要做的就是將其添加爲「位置」字段的驗證器,並根據https://github.com/doctrine/DoctrineModule/blob/master/docs/validator.md entity_class = Db\Entity\Location指定兩個選項,以便驗證程序知道我要驗證的實體以及fields = id,這與驗證標準相似。

現在,當我嘗試發佈場地時,我需要使用"location": {"id":123}指定位置。這也與PATCH合作。當找不到指定ID的位置時,我會收到一個很棒的錯誤消息,這很好。如果沒有提供身份證,則有500人(我想,時間上有一個問題,我猜...)。

現在,我一直試圖找到如何將對象添加到實體集合。 (比如,將產品添加到特定場所)。我試圖將「產品」字段添加到場館服務中,但沒有奏效。我一直在收集場地中沒有任何產品。 這是我正在努力修補程序:

PATCH /venues/1 
{ 
... 
"products":[ 
    {"id": 5} 
] 
... 
} 

在這個任何想法?

回答

0

通常在RESTful API中具有原子CRUD操作是一個好主意。

對您而言,這意味着您最好通過一個名爲POST|GET|DELETE|PUT /location的單獨API資源來CRUD您的位置實體。

然後,API客戶端首先必須檢索或創建一個位置,並在該位置後發佈。

實施例:

步驟1. 創建或檢索位置。

POST /location 
    { 
    "address":"123 Fake Street", 
    "city":"cityTest", 
    "country":"CountryTest", 
    "postalCode":"12345" 
    } 

GET /location/{somefilter} 

第2步: 創建場館

POST /venues 
    { 
    ... 
    "location": 2 //the location id 
    ... 
    } 
+0

是,它使一個很大的意義的REST API,以這樣的工作,但在這種情況下,我在我的項目中使用Apigility與Doctrine模塊(zf-apigility-doctrine),我無法找到實現它的方式那個。 我可以創建Venue和Address,也可以通過在Venue字段+位置執行POST /場所來鏈接它們。我只是無法找到執行PATCH /場館/ 2 _ {「location」:123} _ 的方法有意義嗎? – arthos4g

+0

你的'PATCH /場館/ {id}'端點是否有'位置'字段? – Mark

+0

在我看來,一旦你在你的服務中創建了一個'/ location'端點,然後在你的'/ venues'端點上添加一個'location'字段,那麼一切都應該起作用。 ***注意:***不要忘記刪除舊的'location'字段,因爲那個人需要一個'array'而不是一個整數, – Mark