2012-02-03 24 views
5

Tôi có thể tiêm dịch vụ vào kho lưu trữ thực thể bằng cách tiêm phụ thuộc như thế nào?Tôi có thể tiêm dịch vụ vào một kho lưu trữ thực thể Symfony2 như thế nào?

tôi cố gắng như thế này:

<service id="rp.repository.user" class="RP\CoreBundle\Repository\UserRepository" 
factory-service="doctrine.orm.entity_manager" factory-method="getRepository"> 
    <call method="setSecurityContext"> 
    <argument type="service" id="security.context"/> 
    </call> 
</service> 

nhưng setSecurityContext nó không bao giờ được gọi là Plz giúp

+0

tôi không biết mình muốn làm gì hay không. tôi muốn truy cập vào bối cảnh bảo mật vào kho lưu trữ để kiểm tra xem người dùng hiện tại có role_user hay không để thêm một số bộ lọc trong tất cả các yêu cầu dql. với điều DI i nó không thể bởi vì người quản lý thực thể gọi hàm getRepository và khởi tạo kho lưu trữ được yêu cầu, không lấy nó từ thùng chứa, ai đó có ý tưởng cho vấn đề này? thx rất nhiều – EAdel

Trả lời

8

Tiêm một dịch vụ vào một kho lưu trữ không được khuyến khích, vì nó phá vỡ tách mối quan tâm. Thay vào đó, bạn nên sử dụng một lớp dịch vụ gọi các kho lưu trữ. Dựa trên nhận xét của bạn, luồng công việc đơn giản sẽ trông giống như sau:

  • Xác định UserService lớp và đăng ký làm dịch vụ.
  • Tiêm security.context vào UserService
  • Xác định UserService::getUsers() (hoặc bất kỳ phương pháp nào bạn muốn). Nó ở đây trong phương pháp mà bạn sẽ sử dụng security.context để đặt tiêu chí cho truy vấn. Bạn có thể chuyển trực tiếp tiêu chí đến phương thức UserRepository::getUsers() hoặc xây dựng DQL trong đối tượng UserService và chuyển nó đến UserRepository.
  • UserService::getUsers() trả lại bất kỳ giá trị nào UserRepository::getUsers() trả về.

Đây là cách tôi muốn xử lý các tình huống như thế này, nhưng vì mục đích hoàn chỉnh, bạn cũng có thể sử dụng tiêm setter đơn giản trên kho lưu trữ của mình. Bạn sẽ tìm nạp kho lưu trữ thông qua trình quản lý thực thể (và không phải từ vùng chứa dịch vụ như trong câu hỏi của bạn), và chỉ cần gọi $userRepository->setSecurityContext($this->get('security.context')).

+0

và có thể là ngoại lệ nếu nó được yêu cầu? – GorillaApe

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