2012-07-29 110 views
1

我想創建一個簡單的博客示例,其中用戶有一個喜歡的類別附加到那裏帳戶。這意味着只能寫這個類別的文章。 (其中一些 - 主要是管理員 - 將有機會切換類別,但這不是問題...現在^^)在EntityRepository中訪問當前登錄的用戶

所以我首先創建了用戶和類別實體之間的關係。一切正常。每個用戶現在都選擇了一個主要類別。

唯一令我困擾的是我無法掌握EntityType(formbuilder)和EntityRepository類中當前登錄的用戶。

在我的「新郵政」形式中,與其他實體(如標籤)有關係。我在EntityType類中使用'entity'formtype來生成這些表單元素。現在,我不想過濾標籤,只允許與當前登錄的用戶類別具有相同類別關係的標籤可供選擇。

我試圖使用實體formtype中的query_builder選項。但是因爲我無法獲得當前的用戶對象,我不知道他選擇了哪個類別。與EntityRepository同樣的問題。

現在我可以過濾已經在PostController中的標籤,但問題是,我會一遍又一遍地需要。因此,我不想每次添加新內容時都要編碼。

我認爲這是最好把這個過濾器放在EntityRepository中。所以我總是可以訪問findAllByCategory。但我需要那裏的用戶對象。

完成此操作的最佳方法是什麼?尋覓了很多,但無論是我尋找了錯誤的條款或沒有人有這個問題:)

回答

1

您可以定義爲一個服務表單類型注入安全上下文。然後在你的代碼字段中使用查詢生成器與$user(當前登錄用戶)來篩選具有相同類別的關係與當前登錄標籤:

/** @DI\Service("form.type.post") */ 
class PostType extends \Symfony\Component\Form\AbstractType 
{ 
    /** 
    * @var \Symfony\Component\Security\Core\SecurityContext 
    */ 
    protected $securityContext; 

    /** 
    * @DI\InjectParams({"securityContext" = @DI\Inject("security.context")}) 
    * 
    * @param \Symfony\Component\Security\Core\SecurityContext $context 
    */ 
    public function __construct(SecurityContext $securityContext) 
    { 
     $this->securityContext = $securityContext; 
    } 

    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $user = $this->securityContext()->getToken()->getUser(); 

     $builder->add('tags', 'entity', array(
      'label'   => 'Tags', 
      'class'   => 'Acme\HelloBundle\Entity\Tag', 
      'property'  => 'name', 
      'query_builder' => function(EntityRepository $er) use($user) { 
       return $er->getAllSuitableForUserChoiceQueryBuilder($user); 
      }, 
      'multiple'  => true, 
      'expanded'  => true, 
    } 
} 

過濾器標記到你的資料庫:

class TagRepository extends EntityRepository 
{ 
    public function getAllSuitableForUserChoiceQueryBuilder(User $user) 
    { 
     // Filter tags that can be selected by a given user 
    } 
} 
+0

根據你的評論http://stackoverflow.com/questions/11709246/access-currently-logged-in-user-in-entityrepository/11709590#comment15534115_11709590 如果您認爲注射不是正確的方法,那麼您爲什麼建議相同? :) – 2012-07-29 16:20:18

+0

@thecatontheflat我注入的表單類型(正確的地方...)不在標籤實體。你說過「你可以將你的實體定義爲服務」 - 哦,不,不是。 – gremo 2012-07-29 16:21:53

+0

明白了。謝謝:) – 2012-07-29 16:22:59

2

您可以從Security Context

$user = $serviceContainer->get('security.context')->getToken()->getUser(); 

小提示:獲取用戶對象:在情況下,如果用戶不登錄 - 您將在$user有字符串,否則 - 用戶對象。

乾杯;)

+0

是的,我知道這一點。但是如何從控制器中獲取其他security.context? – 2012-07-29 13:43:51

+0

你可以定義你的實體爲服務,並注入'security.context'那裏 – 2012-07-29 14:13:01

+0

我認爲注入實體中的上下文並不是正確的方式來做這件事... – gremo 2012-07-29 16:13:31

1

試圖使用實體formtype中的query_builder選項。但是因爲我無法獲得當前的用戶對象,我不知道他選擇了哪個類別。與EntityRepository同樣的問題。

只要類別與用戶有關係,就應該能夠在那裏獲得用戶。

例如:

控制器

$someThing = new SomeThing(); 
$someThing->setUser($user); 
$form = $this->createForm(new someThingType(), $someThing); 

形式

$someThing = $options['data']; 
$user  = $someThing->getUser(); 
$builder->add('category', null, array(
    'class' => 'MyBundle:Cateogry', 
    'query_builder' => 
     function(EntityRepository $er) use ($user) { 
      return $er->getCategoriesForUser($user); 
     } 
)); 

public function getCategoriesForUser($user) 
{ 
    $qb = $this->createQueryBuilder('c'); 
    $qb->leftJoin('c.user', 'u', 'with', 'u.user = :user'); 
    $qb->setParameter('user', $user) 
    ; 

    return $qb; 
} 

這不正是你的使用情況,但非常相似的。也許它可以幫助你。