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'))
.
Nguồn
2012-02-03 15:55:54
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