我已经阅读了很多这方面的主题,我似乎无法找到解决问题的方法。
我觉得问题很明显,也许我刚刚盯着它看了太长时间。
错误是FatalErrorException:错误:调用成员函数has()在/vagrant/vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php第198行中的非对象/ p>
查看错误行,它说。
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"]
答案 0 :(得分:23)
问题是容器没有注入控制器。
通常情况下,如果您展开Symfony\Bundle\FrameworkBundle\Controller\Controller
,Symfony会自动执行此操作,Symfony\Component\DependencyInjection\ContainerAware
本身会延伸use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class YourController extends Controller
:
setContainer()
使用setter injection以容器作为参数调用方法services:
database_controller:
class: Fuel\FormBundle\Controller\DatabaseController
calls:
- [setContainer, ["@service_container"]]
,将容器注入控制器(如果未明确定义为服务)。
现在,当您将控制器配置为服务时,需要将setContainer调用添加到服务配置中:
{{1}}
之后清除缓存。
答案 1 :(得分:1)
不确定为什么要将控制器作为服务。对于什么用例?通常,服务是普通的旧PHP对象。
关于您的问题..由于您将控制器用作服务,因此无法自动获取容器。所以你必须注入整个容器,如果你只需要学说那么这个容器很重。
所以最好只注入你真正需要的东西。要在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-as-a-dependency-of-your-service
答案 2 :(得分:1)
还有一个建议:当您从主控制器移出数据库连接时,您需要构建实体管理器的新实例,例如:
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;
}