Trong ứng dụng Symfony 2 của tôi, tôi có 3 vai trò người dùng khác nhau có thể được tiếp cận với một bộ phận quản lý backend:Bind một lộ trình để điều khiển khác nhau tùy thuộc vào vai trò người dùng
role_hierarchy:
ROLE_STAFF: ROLE_USER
ROLE_MODERATOR: ROLE_STAFF
ROLE_ADMIN: ROLE_MODERATOR
Đối với một lộ trình như http://example.org/admin/post/
, tôi muốn như ứng dụng của tôi hiển thị thông tin khác nhau tùy thuộc vào vai trò của người dùng, có nghĩa là 3 bộ điều khiển ràng buộc với một chỉ tuyến đường.
Cách tốt nhất để xử lý việc này là gì?
Tôi đã suy nghĩ về một số giải pháp nhưng không ai có vẻ là tốt cho tôi:
Một bộ điều khiển, và trong mỗi hành động tôi chỉ thử nghiệm sử dụng vai trò:
<?php /** * @Route("/admin/post") */ class PostController extends Controller { /** * Lists all post entities. * * @Route("/", name="post_index") * @Template() * @Secure(roles="ROLE_STAFF") */ public function indexAction() { $user = $this->get('security.context')->getToken()->getUser(); if ($this->get('security.context')->isGranted('ROLE_STAFF')) { // Do ROLE_STAFF related stuff } else if ($this->get('security.context')->isGranted('ROLE_MODERATOR')) { // Do ROLE_MODERATOR related stuff } else if ($this->get('security.context')->isGranted('ROLE_ADMIN')) { // Do ROLE_ADMIN related stuff } return array('posts' => $posts); } }
Thậm chí nếu điều đó không công việc, IMO rõ ràng đó không phải là một thiết kế tốt.
Một BackendController rằng cử tới 3 bộ điều khiển khác nhau:
<?php /** * @Route("/admin/post") */ class PostBackendController extends Controller { /** * Lists all post entities. * * @Route("", name="admin_post_index") * @Template("AcmeBlogBundle:PostAdmin:index.html.twig") * @Secure(roles="ROLE_STAFF") */ public function indexAction() { if ($this->get('security.context')->isGranted('ROLE_STAFF')) { $response = $this->forward('AcmeBlogBundle:PostStaff:index'); } else if ($this->get('security.context')->isGranted('ROLE_MODERATOR')) { $response = $this->forward('AcmeBlogBundle:PostModerator:index'); } else if ($this->get('security.context')->isGranted('ROLE_ADMIN')) { $response = $this->forward('AcmeBlogBundle:PostAdmin:index'); } return $response; } }
Tương tự như số một.
tôi đã cố gắng để làm cho bộ điều khiển mở rộng mỗi người khác:
<?php /** * @Route("/admin/post") */ class PostStaffController extends Controller { /** * Lists all post entities. * * @Route("/", name="post_index") * @Template() * @Secure(roles="ROLE_STAFF") */ public function indexAction() { $user = $this->get('security.context')->getToken()->getUser(); // Do ROLE_STAFF related stuff return array('posts' => $posts); } } <?php /** * @Route("/admin/post") */ class PostModeratorController extends PostStaffController { /** * Lists all post entities. * * @Route("/", name="post_index") * @Template() * @Secure(roles="ROLE_MODERATOR") */ public function indexAction() { $user = $this->get('security.context')->getToken()->getUser(); // As PostModeratorController extends PostStaffController, // I can either use parent action or redefine it here return array('posts' => $posts); } } <?php /** * @Route("/admin/post") */ class PostAdminController extends PostModeratorController { /** * Lists all post entities. * * @Route("/", name="post_index") * @Template() * @Secure(roles="ROLE_ADMIN") */ public function indexAction() { $user = $this->get('security.context')->getToken()->getUser(); // Same applies here return array('posts' => $posts); } }
IMO đó là một thiết kế tốt hơn nhưng tôi không thể quản lý để làm cho nó hoạt động. Hệ thống định tuyến dừng trên bộ điều khiển đầu tiên nó khớp. Tôi muốn làm cho nó hành động vua của tầng phong cách tự động (tức là nếu người dùng là nhân viên sau đó đi đến PostStaffController, nếu không nếu người dùng là người điều hành đi đến PostModeratorController, nếu không đi đến PostAdminController).
Thêm người nghe vào kernel.controller trong BlogBundle của tôi sẽ thực hiện công việc giống như số 2?
Tôi đang tìm thiết kế tốt nhất và giải pháp linh hoạt hơn có khả năng chúng tôi sẽ thêm nhiều vai trò hơn trong tương lai.
Tôi đang đối mặt với tình huống tương tự, bạn đã tìm thấy giải pháp tốt chưa? –
Tất cả các giải pháp đều tốt nhưng được thiết kế kém. Nếu bạn gặp phải vấn đề tương tự, trước tiên hãy đảm bảo rằng đó không phải là quan niệm sai về đơn đăng ký của bạn. Trong trường hợp của tôi thay vì làm điều này, tôi đã tạo 2 loại biểu mẫu khác cho thực thể của tôi: tức là "cấu hình" và "tuỳ chỉnh". Vì vậy, quản trị viên có thể truy cập bộ điều khiển "cấu hình" và "tùy chỉnh" trong khi nhân viên và người kiểm duyệt chỉ có thể truy cập "tuỳ chỉnh". Không chắc chắn nếu nó rõ ràng. Có lẽ tôi nên làm cho nó một câu trả lời hoàn chỉnh? – iamdto
Bạn nói đúng, đó là một thiết kế tồi. Giải pháp của tôi là phân tách các khu vực khác nhau của ứng dụng trong các nhóm khác nhau, nơi tôi có thể quản lý các vai trò cho phù hợp. Cảm ơn. –