2011-11-23 32 views
5

Hãy nói rằng tôi có một User Entity:Làm thế nào để sử dụng dịch vụ dịch trong một thực thể?

$user = new User(007); 
echo $user->getName(); // display Bond 
echo $user->getGender(); // display "Male"; 
echo $user->getDesignation() // display "Monsieur Bond" or "Mister Bond" 

Với chức năng này:

public function getDesignation() { 
    if ($this->getGender() == 'Male') return "Monsieur ".$this->getName(); 
    else return "Madame ".$this->getName(); 
} 

Làm thế nào tôi có thể sử dụng dịch vụ phiên dịch bên trong Entity này để dịch "Monsieur" và "Madame"?

Dường như dịch vụ dịch chỉ nên được sử dụng bên trong Bộ điều khiển, nhưng tôi nghĩ rằng nó phù hợp trong trường hợp đó để sử dụng nó bên trong Thực thể này.

Trả lời

8

Dịch vụ dịch giả, như bạn nói, "dịch vụ", bạn có thể sử dụng dịch vụ bên trong bất kỳ lớp nào (ví dụ: xác định dịch vụ đó và sử dụng vùng chứa bộ phận phụ thuộc). Vì vậy, bạn có thể sử dụng dịch giả hầu như bất cứ nơi nào bạn muốn.

Nhưng các đối tượng như aldo said không nên có trách nhiệm đó. Trong kịch bản tồi tệ nhất nếu bạn thực sự muốn dịch những thứ bên trong tổ chức nào, bạn có thể vượt qua người phiên dịch cho các thực thể có một phương pháp thiết lập, tức là

$entity->setTranslator($translator); 

nhưng tôi khuyên bạn nên quá để tạo ra một lớp để xử lý các vấn đề bên ngoài thực thể, tức là sử dụng mẫu khuôn mẫu

{{ entity.property|trans }}). 
+1

Wouah! Tôi không biết về biến {{$ | hàm trans}}. Tôi tin rằng nó chỉ có thể hoạt động với văn bản thuần túy (và không thay đổi). Cảm ơn nhiều ! – lepix

+0

Vâng, bằng cách này bạn không cần ký hiệu $. Tôi đã làm việc với Smarty ngày hôm nay, trong twig: {{variable | trans}} bạn thậm chí có thể dịch văn bản trả lại từ các chức năng, mảng, vv như: {{app.session.getFlash ('panel_alert'). Msg | xuyên}} – Silence

4

Bạn không nên nói chung là không thể. Theo số Single Responsibility Principle thực thể đã có mục đích của họ, là đại diện cho dữ liệu trên cơ sở dữ liệu. Hơn nữa bản dịch là vấn đề đại diện, vì vậy bạn không muốn giải quyết vấn đề như vậy trong lớp thực thể (trừ khi bạn muốn cung cấp các thực thể được dịch sang các ngôn ngữ khác nhau). người phiên dịch).

Suy nghĩ lại về logic của bạn và thử điều gì đó khác biệt cho điều này. Bạn có chắc chắn rằng bạn không muốn thực hiện bản dịch này trên lớp xem không? Đó sẽ là điều tốt nhất có thể. Nếu không (nếu logic của bạn thực sự cần phải dịch ở mức mô hình), bạn có thể tạo một lớp bao bọc cho các thực thể và một nhà máy để tạo ra "thực thể được bao bọc" này; trong nhà máy đó bạn có thể tiêm dịch vụ dịch giả.

+0

Trong thực tế, tôi đã làm như vậy vì câu hỏi này khác của tôi: http://stackoverflow.com/questions/8174354/on-symfony2- with-doctrine2-does-object-entity Nhưng tôi hiểu những gì bạn nói. Cảm ơn bạn :) – lepix

2

Tôi đã gặp sự cố tương tự và cuối cùng đã tìm thấy giải pháp này. Đây không phải là câu trả lời trực tiếp cho vấn đề của bạn bởi vì tôi cũng biết rằng một thực thể không có liên quan gì đến dịch vụ, như dịch giả. Vì vậy, bạn nên để chức năng getDesignation bị ảnh hưởng. Thay vào đó, trong lớp trình bày, ví dụ, bạn dịch rằng chỉ định tiếng Pháp.

<div>{% trans %}{{ entity.designation }}{% endtrans %} {{ entity.name }}</div> 

Và trong messages.en.yml bạn

Monsieur: Mr. 
Madame: Mrs. 
Các vấn đề liên quan