這裏就是我試圖完成:如何過濾形式的實體將選擇基於ACL的
我有一個簡單的應用程序,管理產品和類別的實體。這些CRUD由SonataAdmin管理。
我的Product
實體與Category
實體(多對一關聯)相關聯。我想要的是,當Sonata的CRUD顯示創建產品的表單時,在類別選擇中,它只列出用戶擁有EDIT
訪問控制條目的類別。
下面是一些代碼來說明這一點:
Product
實體
<?php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Product
*
* @ORM\Table()
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
*/
class Product
{
/**
* @var integer id
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var float
*
* @ORM\Column(name="price", type="float")
*/
private $price;
/**
* @var string
*
* @ORM\Column(name="description", type="text")
*/
private $description;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
*/
protected $category;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/*Getters and setters
...
*/
}
Category
實體
<?php
namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Category
*
* @ORM\Table()
* @ORM\Entity
*/
class Category
{
/**
* @var integer
*
* @ORM\Id
* @ORM\Column(name="id", type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @ORM\OneToMany(targetEntity="Product", mappedBy="category")
*/
protected $products;
public function __construct()
{
$this->products = new ArrayCollection();
}
/*Getters and setters
...
*/
}
的ProductAdmin
索納塔CRUD
<?php
namespace Acme\DemoBundle\Admin;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Symfony\Component\Security\Acl\Domain\UserSecurityIdentity;
use Symfony\Component\Security\Acl\Permission\MaskBuilder;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
class ProductAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', 'text', array('label' => 'Product name'))
// HOWTO FILTER THESE ???
->add('category', 'entity', array('class' => 'Acme\DemoBundle\Entity\Category'))
->add('price')
->add('description')
;
}
/* More here, but kept short for the example
...
*/
}
我想是在ProductAdmin::configureFormFields
whithin調用檢查ACL來->add('category', 'entity', array('class' => 'Acme\DemoBundle\Entity\Category'))
任何幫助非常感謝的一種方式。 FL。
依賴注入的解決方案似乎是很好的,但我還有最後一個問題(接受答案之前)。在編輯表單的情況下,我需要能夠根據編輯對象的ACL禁用某些字段。 (例如,只有當用戶作爲該類別的「編輯」權限時才允許更改產品類別)。這將需要訪問Admin :: getForm調用中的編輯對象,這在奏鳴曲的Admin類中似乎不是這種情況。任何想法 ? –
好吧,我發現他適合我的需求:它被稱爲FormEventSubscriber:http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html –