Fluent setter在工厂返回null值 - PHP

时间:2017-05-26 09:21:00

标签: php symfony factory setter fluent

在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 命令使用的服务使用。 我们现在解释一下这个问题:

  • 在使用dev fixture的本地开发环境中执行命令时,工厂会正确创建并返回该对象。
  • 使用preprod数据库在本地开发环境中执行命令时,工厂会正确创建并返回该对象。
  • 使用preprod数据库在preprod环境中执行命令时,会引发以下错误:

PHP致命错误:在第37行的/var/www/application/src/Company/MyBundle/Factory/ChildRequestFactory.php中调用null上的成员函数setFoo()

[Symfony的\元器件\调试\异常\ FatalErrorException]   错误:在null

上调用成员函数setFoo()

异常追踪:  ()at /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)

当我不使用流利的设置器时,它解决了preprod环境中的问题。

有什么想法吗?

注意:我已经更改了捆绑包的名称以及一些用于保密的变量/类/方法。

更新:

这是setIsValid setter返回null。

/**
 * Set is_valid
 *
 * @param integer $isValid
 */
public function setIsValid($isValid)
{
    $this->isValid = $isValid;

    return $this;
}

2 个答案:

答案 0 :(得分:3)

所以我找到了问题的根源。我通常使用命令行进行rebase,interactive rebase或bisects等操作,但我使用GitKraken进行简单的提交和推送。我认为使用它有一些问题,因为包括使所有设置器流畅的更改没有被推到preprod环境。遗憾的是我没有看到它...除了这些之外,所有新的变化都出现在preprod环境中。谢谢大家。

答案 1 :(得分:1)

也许setIsValid不会返回$this另一个对象?