【问题标题】:Fluent setter returning null value on a factory - PHPFluent setter 在工厂返回空值 - PHP
【发布时间】: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


【解决方案1】:

也许setIsValid 不返回$this 或其他对象?

【讨论】:

  • 我已经检查过这个问题。所有的设置器都返回 $this ......为什么它不能只在具有相同数据夹具的 preprod 环境中工作?
  • 没有代码我无法回答。也许你在那个 setter 中有一些条件并返回 null/void。或者您覆盖类和子(或父)返回 null。
【解决方案2】:

所以我找到了问题的根源。我通常使用命令行进行变基、交互式变基或平分等操作,但我使用 GitKraken 进行简单的提交和推送。我想使用它存在一些问题,因为包括使所有设置者流利的更改没有推送到 preprod 环境。可惜我没看到……除了这些之外,所有的新变化都存在于 preprod 环境中。谢谢大家。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多