【发布时间】:2017-10-27 03:13:39
【问题描述】:
在一个 Symfony 项目中,我在下面创建了工厂:
<?php
namespace Company\MyBundle\Factory;
use Company\MyBundle\Entity\ParentRequest;
use Company\MyBundle\Entity\ChildRequest;
use Company\MyBundle\Entity\Foo;
use Company\MyBundle\Entity\Bar;
/**
* Class ChildRequestFactory
*
* Factory instanciating ChildRequest with several values
* @package Company\MyBundle\Factory
*/
class ChildRequestFactory extends AbstractRequestFactory
{
/**
* @param \DateTime $date
* @param Bar|null $bar
* @param Foo|null $foo
* @return ChildRequest
*/
public function createRequest(\DateTime $date, Bar $bar
= null, Foo $foo = null)
{
$childRequest = new ChildRequest();
$childRequest
->setDateValidation($date)
->setIsValid(ParentRequest::IS_VALIDATED)
->setFoo($foo)
->setBar($bar)
->setBaz('baz')
->setOrigin('Manager')
;
return $childRequest;
}
这个工厂被一个 Symfony command 使用的 Service 使用。 让我们现在解释一下这个问题:
- 在本地开发环境中使用开发设备执行命令时,工厂正确创建并返回对象。
- 在本地开发环境中使用 preprod 数据库执行命令时,工厂正确创建并返回对象。
- 使用preprod数据库在preprod环境中执行命令时,出现以下错误:
PHP 致命错误:在第 37 行的 /var/www/application/src/Company/MyBundle/Factory/ChildRequestFactory.php 中调用成员函数 setFoo() on null
[Symfony\Component\Debug\Exception\FatalErrorException] 错误:在 null 上调用成员函数 setFoo()
异常跟踪: () 在 /var/www/application/src/Company/MyBundle/Factory/ChildRequestFactory.php:37
此错误仅出现在 preprod 环境中。 我已经检查了版本,代码在本地和 preprod 环境的同一个 git 分支上。 缓存已在 preprod 中删除。 数据库同步/模式更新:好的
Symfony 版本:2.7.13(本地和 preprod) PHP 版本:5.6.17(本地)/5.6.23(预生产)
当我不使用流利的设置器时,它可以解决 preprod env 上的问题。
有什么想法吗?
注意:为了保密,我更改了包的名称和一些变量/类/方法。
更新:
这是返回 null 的 setIsValid 设置器。
/**
* Set is_valid
*
* @param integer $isValid
*/
public function setIsValid($isValid)
{
$this->isValid = $isValid;
return $this;
}
【问题讨论】:
-
向我们展示您的
setIsValid方法 -
我敢打赌,
ParentRequest::IS_VALIDATED有问题 - 一些自动加载问题或类似问题,但很难确定。您可以尝试将其更改为具体值并查看是否可行吗? -
@TomaszMadeyski 当传递像 1 这样的具体值时它不起作用。同样的问题
-
唯一可能的原因是没有到达
return $this;,可能是由于事先引发的异常或错误 -
@GhostCat 我的错误。谢谢你的建议。
标签: php symfony factory setter fluent