2012-03-15 31 views
14

Tôi đã nhận được "500 Lỗi Máy chủ Nội bộ - LogicException: Không thể đoán cách lấy một cá thể Doctrine từ thông tin yêu cầu".Không thể đoán cách lấy một cá thể Doctrine từ thông tin yêu cầu

Dưới đây là định nghĩa hành động điều khiển của tôi:

/** 
* @Route("/gatherplayer/{player_name}/{gather_id}") 
* @Template() 
*/ 
public function createAction(Player $player, Gather $gather) 
{ 
    // ... 
} 

Và nó không hoạt động, có lẽ vì học thuyết 2 không thể "đoán" ... Vì vậy, làm thế nào để làm cho học thuyết 2 đoán, và tốt?

+2

Bạn nên xem chú thích [@ParamConverter] (http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html). – 1ed

Trả lời

6
/** 
* @Route("/gatherplayer/{name}/{id}") 
* @Template() 
*/ 
public function createAction(Player $player, Gather $gather) 

tôi không tìm thấy bất kỳ sự giúp đỡ trong tài liệu (nghèo?) Paramconverter, vì nó không mô tả cách thức hoạt động, làm thế nào nó đoán với nhiều hơn một thông số và công cụ. Plus Tôi không chắc nó là cần thiết vì những gì tôi vừa viết hoạt động đúng.

Bí ẩn của tôi không phải là sử dụng tên thuộc tính của tôi để giáo lý không thể đoán đúng. Tôi đã thay đổi {player_name} thành {name} và {gather_id} thành {id}.

Sau đó, tôi đã thay đổi tên của id của tôi vào đơn vị của họ từ "id" để "id_gather" và "id_player" vì vậy tôi bây giờ có thể làm điều đó:

/** 
* @Route("/gatherplayer/{id_player}/{id_gather}") 
* @Template() 
*/ 
public function createAction(Player $player, Gather $gather) 

đó là rất nhiều hiệu quả hơn hơn

* @Route("/gatherplayer/{id}/{id}") 

Bây giờ tôi đang tự hỏi làm thế nào tôi có thể làm công việc này

/** 
    * @Route("/gatherplayer/{player}/{gather}") 
    * @Template() 
    */ 
public function deleteAction(Gather_Player $gather_player) 
0

@ 1ed là đúng, bạn nên xác định @paramConverter để lấy phiên bản Trình phát hoặc phiên bản Tập hợp.

+0

Làm cách nào để sử dụng @paramConverter trong tệp cấu hình YAML? – linuxatico

+0

@paramConverter được triển khai bởi SensioFrameworkExtraBundle. Tôi không nghĩ rằng các gói phơi bày chức năng này thông qua tập tin cấu hình yml o xml, tôi nghĩ rằng cách duy nhất là sử dụng chú thích. – ftassi

3

thử điều này:

/** 
* @Route("/gatherplayer/{player_name}/{gather_id}") 
* @ParamConverter("player", class="YourBundle:Player") 
* @ParamConverter("gather", class="YourBundle:Gather") 
* @Template() 
*/ 
public function createAction(Player $player, Gather $gather) 
22

Giáo Lý không biết làm thế nào để sử dụng lại tham số nhiệm vụ để truy vấn các thực thể được chỉ định trong chữ ký của hàm.

Bạn sẽ cần phải giúp nó bằng cách xác định một số thông tin bản đồ:

/** 
    * @Route("/gatherplayer/{player_name}/{gather_id}") 
    * 
    * @ParamConverter("player", options={"mapping": {"player_name" : "name"}}) 
    * @ParamConverter("gather", options={"mapping": {"gather_id" : "id"}}) 
    * 
    * @Template() 
    */ 
public function createAction(Player $player, Gather $gather) 
{ 
    // ... 
} 
0

Các thông số trên chữ ký của chú thích @Route phải phù hợp với lĩnh vực tổ chức, do đó học thuyết làm cho tự động chuyển đổi.

Nếu không, bạn cần thực hiện chuyển đổi theo cách thủ công bằng cách sử dụng chú thích @ParamConverter như được đề cập trên các phản hồi khác.

Các vấn đề liên quan