Symfony2 でのコントローラー、EntityRepository、Doctrine Fixtures の組み合わせに苦労しています。
私の ImageParts エンティティは画像の一部です。ランダムピースを使用してランダムに画像を生成したい。
そのため、ImagePart というエンティティと、'ImagePartRepository' という名前の EntityRepository があります。
その EntityRepository 内で、「getRandomImagePart()」という関数を作成しました。これは、ルートを使用してテストしたときに正常に動作しています。
しかし、フィクスチャ内でこの関数を使用する方法がわかりません。サービスを宣言する必要があると思いますが、それでも機能させることができません。表示されるエラー メッセージの種類は、明らかに構造的に間違ったことをしていることを示しています。
さらに、Symfony2 フレームワークを正しい方法で機能的に使用しているかどうか疑問に思っています。例: フィクスチャ内で EntityRepository を使用できるようにする必要があります。
コントローラ:
<?php
namespace AMM\AMMBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\Finder\Finder;
use AMM\AMMBundle\Entity\ImagePart;
use Doctrine\ORM\Mapping as ORM;
class ImagePartController extends Controller implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
protected $container;
/**
* {@inheritDoc}
*/
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
public function getRandomImagePartAction($type)
{
/*
$sql = "
SELECT a.imagePartBase64 FROM imageparts a
WHERE a.imagePartCategory = '".$type."'
ORDER BY RAND()
LIMIT 1
";
*/
$em = $this->getDoctrine()
->getManager();
$imagePart = $em->createQueryBuilder()
->select('g')
->from('AMMBundle:ImagePart', 'i')
->addOrderBy('i.id', 'ASC')
->getQuery()
->getSingleResult();
// $conn = $this->get('database_connection');
//$randomimagepart = $conn->fetchAll($sql);
// return $randomimagepart[0]['imagePartBase64'];
return $imagePart;
}
// ..
public function generateRandomImage()
{
$object->getRandomImagePartAction('BACKGROUND');
}
フィクスチャ ファイル ImageFixtures.php
<?php
namespace AMM\AMMBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use AMM\AMMBundle\Entity\ImagePart;
class GenerateImages implements FixtureInterface, ContainerAwareInterface, OrderedFixtureInterface
{
private $container;
public function load(Objectmanager $manager)
{
$image= new Image();
$imageGenerator = $this->container
->get('imageGenerator')
->GenerateRandomImage();
$manager->persist($image);
$manager->flush();
}
私のservices.yml:
services:
imageGenerator:
class: AMM\AMMBundle\Controller\ImagePartController
したがって、基本的に私が行うことは、同じコントローラー内の関数から関数を呼び出すことです。これは、たとえばビューでテストするときにうまく機能します。
しかし、Doctrine フィクスチャをロードしようとすると、次のエラーが発生します。
致命的なエラー: 198 行目の C:\wamp\www\amm\vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php の非オブジェクトに対するメンバー関数 has() の呼び出し
スタック トレースの最後:
5.7077 41983128 15. AMM\AMMBundle\Controller\ImagePartController->getRandomImagePartAction() C:\wamp\www\amm\src\AMM\AMMBundle\Controller\ImagePartController.php:119
5.7077 41983128 16. Symfony\Bundle\FrameworkBundle\Controller\Controller->getDoctrine() C:\wamp\www\amm\src\AMM\AMMBundle\Controller\ImagePartController.php:44