2012-12-07 27 views
6

Tôi đã mã hóa một trang hiển thị tất cả quản trị viên của hệ thống. Những gì tôi muốn làm là tùy chỉnh truy vấn của tôi để nó sẽ loại trừ người dùng được xác thực hiện tại khỏi danh sách.
Bây giờ tôi biết tôi có thể lấy user_id từ bộ điều khiển và chuyển nó vào kho lưu trữ thực thể, nhưng tôi đã tự hỏi liệu có cách nào truy cập trực tiếp thông qua Entity Repository không?Symfony2 nhận id người dùng trong kho lưu trữ thực thể

Ví dụ:

use Doctrine\ORM\EntityRepository; 
use Doctrine\ORM\NoResultException; 

use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\UserProviderInterface; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 
use Symfony\Component\Security\Core\Exception\UnsupportedUserException; 

class AdminUserRepository extends EntityRepository implements UserProviderInterface 
{ 
    public function getAdmins($int = 10, $offset = 0, array $orderBy = array('admin_id', 'asc')){ 
     $admin_id = fetch the admin id ?; 
     $query = $this->createQueryBuilder('admins') 
      ->where("admins.admin_id != '".$admin_id."'") 
      ->orderBy('admins.'.$orderBy[0], $orderBy[1]) 
      ->setFirstResult($offset) 
      ->setMaxResults($int) 
      ->getQuery() 
      ->getResult(); 
     return $query; 
    } 
} 

Trả lời

1

Vì vậy, bạn có một ID người dùng hiện tại (giả sử, $currentUserId), và bạn muốn viết một truy vấn cho tất cả người sử dụng với một ID đó là không bằng $currentUserId?

Hãy thử điều này:

class SomeController 
{ 
    public function someAction() 
    { 
     ... 

     $qb = $userRepository->createQueryBuilder("user") 
      ->where("user.id != ?1") 
      ->setParameter(1, $currentUserId); 

     $usersExcludingCurrent = $qb->getQuery()->getResult(); 

    ... 
    } 
} 

chỉnh sửa

Ahh, tôi thấy những gì bạn đang nói ...

Vâng, kho thực sự nên làm ngơ trước bất cứ điều gì bên ngoài Của chính nó. Đó là, nó không phải là nhận thức container, và do đó không nên biết ai là người dùng hiện tại.

Đề xuất của tôi là cung cấp cho kho lưu trữ một chức năng nhận mọi thứ ngoại trừ một User hoặc User ID cụ thể. Một cái gì đó như:

class AdminUserRepository extends EntityRepository implements UserProviderInterface 
{ 
    public function getAllAdminsExcept($userId, $int = 10, $offset = 0, array $orderBy = array('admin_id', 'asc')) 
     { 
      ... 
     } 
} 

Sau đó đặt logic "Người dùng hiện tại" vào bộ điều khiển của bạn. Bạn thậm chí có thể xác định một dịch vụ có quyền truy cập vào cả hai @security@doctrine, và nhà tất cả các logic đó. Cuộc gọi của bạn, nhưng tôi muốn nói rằng bạn chắc chắn nên giữ kho lưu trữ của bạn không biết bất cứ điều gì đang diễn ra trong dịch vụ bảo mật.

+0

Tôi đã cập nhật câu hỏi của mình. Tôi biết tôi có thể làm điều đó theo cách bạn đang nói, nhưng tôi đang tìm kiếm nếu nó có thể được thực hiện trong 'EntityRepository' chính nó. – tftd

+0

/cập nhật ... hy vọng điều đó sẽ hữu ích. –

+0

Tôi đã suy nghĩ cùng một điều nhưng đó là loại hợp lý (đối với tôi) để có thể truy cập dữ liệu người dùng xác thực từ bên trong một kho lưu trữ. Cảm ơn bạn đã giúp đỡ :) – tftd

-3

Bạn có thể lấy đối tượng người dùng bằng cách

public function indexAction() 
{ 
    $user = $this->getUser(); 
} 

điều khiển máng hoặc xem bằng cành mẫu:

<p>Username: {{ app.user.username }}</p> 

mẫu này đến từ symfony 2 doc.

+0

Bạn không thể trong kho lưu trữ – Matheno

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