2016-01-13 58 views
0

我正在使用Dunglas API平臺包(https://github.com/api-platform/api-platform)爲一個新的應用程序。DunglasApiBundle - 試圖獲取包使用命名構造函數而不是公共構造函數

安裝和安裝進行得很好,GET請求正在工作。

嘗試使用POST請求創建新對象時,我收到有關具有私有構造函數的錯誤。我的模型全部使用私有構造函數,並使用命名構造函數代替。

理想情況下,我要麼尋找一種方法讓捆綁調用我命名的構造函數,...或者有人告訴我,我的方法是完全錯誤的。

Services.yml

services: 
    resource.player: 
     parent: "api.resource" 
     arguments: [ "Name\\Space\\Player" ] 
     tags:  [ { name: "api.resource" } ] 

播放器目標

class Player 
{ 
    private $name; 
    private function __construct() 
    { 
    } 
    public static function withName($playerName) 
    { 
     $player = new Player(); 
     $player->name = $playerName; 
     return $player; 
    } 
    public function getName() 
    { 
     return $this->name; 
    } 
} 

設置是幾乎所有開箱,繼文檔中的介紹和設置。我簡單地瀏覽了Factory的東西 - 希望能夠使用工廠創建對象,允許我調用自己命名的構造函數 - 但這似乎並沒有做到我認爲的那樣。

有關使用,邊界或設置的任何輸入,我們非常感謝。

回答

0

API平臺(與大多數Symfony和Doctrine相關的庫一樣)不能用於像這樣的不可變對象。

我建議創建一個典型的可變實體的建議在doc:

class Player 
{ 
    private $name; 

    public static function setName($playerName) 
    { 
     $this->name = $playerName; 
    } 

    public function getName() 
    { 
     return $this->name; 
    } 
} 

如果你真的想保持你一成不變的模式,你需要實現自己的Symfony\Component\PropertyAccess\PropertyAccessorInterface並使用CompilerPass使API平臺使用您自己的實現。您可能需要向API平臺和Symfony串行器組件提交補丁,以更新給定對象的引用,因爲目前,兩個序列化器實際上都更新當前對象,並且不會使用您的with方法返回的新實例。

我強烈建議您切換到典型的可變實體。