フレームワーク バンドルでコントローラーを使用し、コントローラーに永続化ロジックを記述している場合はSymfony\Bundle\FrameworkBundle\Controller\Controller
、次のように拡張できます。
namespace ExampleNameSpace\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class BaseController extends Controller
{
public function persistAndSave($entity)
{
$em = $this->getDoctrine()->getEntityManager();
$em->persist($entity);
$em->flush();
}
}
ExampleNameSpace\Controller\BaseController
他のすべてのコントローラーで、Symfony Frameworkbundle のコントローラーではなく、独自のコントローラーを拡張します。
別の方法として、私が取っているアプローチは、クラス名と注入されたドクトリン エンティティ マネージャーを持つエンティティごとにマネージャー クラスを作成することです。各マネージャー クラスは、次のメソッドを使用して抽象マネージャー クラスを拡張します。
<?php
abstract class AbstractManager
{
/**
* The Entity Manager
*
* @var \Doctrine\ORM\EntityManager The Doctrine Entity Manager
*/
protected $em;
/**
* The full class path associated with the repository
*
* @var string
*/
protected $class;
/**
* The repository for the manager
*
* @var \Doctrine\ORM\EntityRepository
*/
protected $repository;
/**
* Creates a new instance of the primary class managed by a given
* manager
*
* @return object A new instance of the entity being managed
*/
public function create()
{
return new $this->class();
}
/**
* {@inheritDoc}
*/
public function save($object, $flush = false)
{
if( ! $this->supportsClass($object))
{
throw new \InvalidArgumentException(sprintf('Invalid entity passed to this manager, expected instance of %s', $this->class));
}
$this->em->persist($object);
if($flush === true)
{
$this->flush();
}
return $object;
}
/**
* {@inheritDoc}
*/
public function delete($object, $flush = false)
{
if( ! $this->supportsClass($object))
{
throw new \InvalidArgumentException(sprintf('Invalid entity passed to this manager, expected instance of %s', $this->class));
}
$this->em->remove($object);
if($flush === true)
{
$this->flush();
}
return true;
}
/**
* Convenience method providing access to the entity manager flush method
*/
public function flush()
{
$this->em->flush();
}
/**
* {@inheritDoc}
*/
public function supportsClass($object)
{
return $object instanceof $this->class || is_subclass_of($object, $this->class);
}
/**
* Set class. Setter for dependency injection
*
* @param object $class A class related to this manager
*/
public function setClass($class)
{
$this->class = $class;
}
/**
* Set entity manager. Setter for dependency injection
*
* @param \Doctrine\ORM\EntityManager $entity_manager
*/
public function setEntityManager(\Doctrine\ORM\EntityManager $entity_manager)
{
$this->em = $entity_manager;
}
/**
* Returns the repository
*
* @return \Doctrine\ORM\EntityRepository A Doctrine Repository for the
* class related to this Manager
*/
protected function getRepository()
{
if( ! $this->repository)
{
$this->repository = $this->em->getRepository($this->class);
}
return $this->repository;
}
}
マネージャーは、エンティティに適切なクラスを使用して依存性注入コンテナーで構成され、担当するエンティティの作成、保存、削除、およびリポジトリへのアクセスを提供します。
次のように、マネージャを使用してコントローラにエンティティを作成します。
public function createAction(Request $request)
{
$entityManager = $this->get('some.entity.manager');
$entity = $entityManager->create();
$form = $this->createForm(new EntityForm(), $entity);
$form->bindRequest($request);
if($form->isValid())
{
$entityManager->save($entity, true);
}
}