我读了很多关于这个问题的主题,但我似乎找不到解决问题的方法。
我觉得这个问题很明显,也许我只是盯着它太久了。
错误是 FatalErrorException:错误:调用成员函数 has(( 在/vagrant/vendor/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 控制器添加了几件事。
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"]
问题是容器没有注入到这里的控制器中。
通常,如果你正在扩展Symfony'Bundle'FrameworkBundle'Controller'Controller
,Symfony会自动执行此操作,它本身扩展Symfony'Component'DependencyInjection'ContainerAware
:
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
class YourController extends Controller
容器使用setter注入注入控制器(如果未显式定义为服务(,调用方法setContainer()
容器作为参数。
现在,当您将控制器配置为服务时,您需要将 setContainer 调用添加到服务配置中:
services:
database_controller:
class: Fuel'FormBundle'Controller'DatabaseController
calls:
- [setContainer, ["@service_container"]]
之后清除缓存。
不知道为什么要将控制器作为服务。用于什么用例?通常,服务是一个普通的旧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-as-a-dependency-of-your-service
还有一个建议:当您将数据库连接移出主控制器时,您需要构造实体管理器的新实例,例如:
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;
}