7

これについて多くのトピックを読んでいますが、問題の解決策が見つからないようです。

問題は明らかで、あまりにも長い間それを見つめていたのかもしれません。

エラーは FatalErrorException: Error: Call to a member function has() on a non-object in /vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php 行 198 です

エラー行を見ると、それは言います。

public function getDoctrine()
    {
        if (!$this->container->has('doctrine')) {
            throw new \LogicException('The DoctrineBundle is not registered in your application.');
        }

        return $this->container->get('doctrine');
    }

これが私のコードです...

これは、DAO コントローラーを呼び出しているメイン コントローラーです。

public function clickThroughAction(request $request, $hash)
    {
        if (isset($hash)) {
            $dbController = $this->get('database_controller');
            print_r($dbController->getReferralIdByHash($hash));
            return $this->redirect($this->generateUrl('home'));
        } else {
            return 0;

        }
    }

利用されているサービスです。

services:
    database_controller:
        class:  Fuel\FormBundle\Controller\DatabaseController

これは、データベースを呼び出している dao コントローラーです。

public function getReferralIdByHash($hash)
    {
        $em = $this->getDoctrine()->getManager();
        $query = $em->createQuery(
            'Select u From FuelFormBundle:UserReferrals u WHERE u.user_hash = :hash'
        )->setParameter('hash', $hash);

        $referral = $query->getResult();

        if (!$referral) {
            throw $this->createNotFoundException(
                'No product referral found'
            );
            $logger = $this->get('logger');
            $logger->info('I just got the logger');
            $logger->crit('An error occurred, hash for referrals is not recognized. current hash is: ' . $hash . " .");
            return $this->redirect($this->generateUrl('home'));
        }

        $clickThroughCount = $referral[0]->getClickThrough();
        $referral[0]->setClickThrough($clickThroughCount + 1);
        $em->flush();
        return $referral;
    }

問題は、教義のコンテナが存在しないことだと思います。そのため、問題が発生しています。これを解決する方法がわかりません。

どんな助けでも大歓迎です。ありがとう!

編集


わかりましたので、ここに私が変更したものがあります。

メインコントローラーはそのまま。

DAO Controller いくつかのものが追加されました。

class DatabaseController extends Controller{
    protected  $entityManager;

    public function __construct($entityManager) {
        $this->entityManager = $entityManager;
    }
public function getReferralIdByHash($hash)
    {
        $em = $this->entityManager;
        $query = $em->createQuery(
            'Select u From FuelFormBundle:UserReferrals u WHERE u.user_hash = :hash'
        )->setParameter('hash', $hash);

        $referral = $query->getResult();

        if (!$referral) {
            throw $this->createNotFoundException(
                'No product referral found'
            );
            $logger = $this->get('logger');
            $logger->info('I just got the logger');
            $logger->crit('An error occurred, hash for referrals is not recognized. current hash is: ' . $hash . " .");
            return $this->redirect($this->generateUrl('home'));
        }

        $clickThroughCount = $referral[0]->getClickThrough();
        $referral[0]->setClickThrough($clickThroughCount + 1);
        $em->flush();
        return $referral;
    }
}

サービスは最終的にこのようになりました

services:
     database_controller:
          class:  Fuel\FormBundle\Controller\DatabaseController
          arguments: ["@doctrine.orm.entity_manager"]
4

3 に答える 3

23

問題は、コンテナーがコントローラーに挿入されていないことです。

Symfony\Bundle\FrameworkBundle\Controller\Controller通常、Symfony は、それ自体が extends を拡張している場合、これを自動的に行いますSymfony\Component\DependencyInjection\ContainerAware

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class YourController extends Controller

コンテナーは、コンテナーを引数としてメソッドを呼び出すセッター注入を使用して、(サービスとして明示的に定義されていない場合) コントローラーに注入されます。setContainer()

ここで、コントローラーをサービスとして構成したので、setContainer 呼び出しをサービス構成に追加する必要があります。

services:
    database_controller:
        class:  Fuel\FormBundle\Controller\DatabaseController
        calls:
            - [setContainer, ["@service_container"]]

後でキャッシュをクリアします。

于 2013-10-09T21:52:55.877 に答える
1

コントローラーをサービスにする理由がわかりません。どのようなユースケースですか?通常、サービスは Plain Old PHP オブジェクトです。

あなたの問題について..コントローラーをサービスとして使用しているため、コンテナーは自動的に取得されません。したがって、コンテナ全体を注入する必要があります。教義だけが必要な場合、これはちょっと重いです。

したがって、本当に必要なものだけを注入する方がよいでしょう。ドクトリンを注入するには、以下の yml にclass:

arguments: ["@doctrine.orm.entity_manager"]

次に、コントローラー コンストラクターで次のようにします。

public function __construct($entityManager) {
    $this->entityManager = $entityManager;
}

親コンストラクターを呼び出す必要がある可能性があります (注意してください)。

とにかく完全なサービスコンテナを注入したい場合は、マニュアルの正しいセクションでそれを行うことができます: http://symfony.com/doc/current/cookbook/service_container/scopes.html#passing-the-container -サービスの依存関係として

于 2013-10-09T21:02:03.570 に答える
1

もう 1 つの提案: データベース接続をメイン コントローラーから移動する場合、たとえば、Entity Manager の新しいインスタンスを作成する必要があります。

class StoreController extends Controller{
     public function addstoreAction(Request $request){
     $checkStore = new StoreExistsCheck($this ->getDoctrine()->getManager());
     //your code here
     }

/myBundle/Model フォルダを使用

namespace myBundle\Model;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use myBundle\Entity\Store;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Query;


class StoreExistsCheck extends Controller{

protected $em = null;
protected $kernel = null;

public function __construct(EntityManager $em) {
    $this->em = $em;

}
public function storeExists($argosStore){
    $storeExists = $this->em ->getRepository('myBundle:Store')
                       ->findOneBystoreNumber($argosStore->getStoreNumber());
     return $storeExists;

} 
于 2014-02-24T12:05:54.223 に答える