值必须是字符串的类型,返回null

Mir*_*son 3 symfony api-platform.com

有以下实体:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use ApiPlatform\Core\Annotation\ApiProperty;
use ApiPlatform\Core\Annotation\ApiResource;

/**
 * Address
 *
 * @ApiResource(
 *     collectionOperations={"get"={"method"="GET"}},
 *     itemOperations={"get"={"method"="GET"}}
 *     )
 * @ORM\Table(name="address")
 * @ORM\Entity
 */
class Address
{
    /**
     * @return int
     */
    public function getId(): int
    {
        return $this->id;
    }
    /**
     * @return string
     */
    public function getLat(): string
    {
        return $this->lat;
    }

    /**
     * @param string $lat
     */
    public function setLat(string $lat): void
    {
        $this->lat = $lat;
    }

    /**
     * @return string
     */
    public function getLng(): string
    {
        return $this->lng;
    }

    /**
     * @param string $lng
     */
    public function setLng(string $lng): void
    {
        $this->lng = $lng;
    }

    /**
     * @return string
     */
    public function getStreet(): string
    {
        return $this->street;
    }

    /**
     * @param string $street
     */
    public function setStreet(string $street): void
    {
        $this->street = $street;
    }

    /**
     * @return string
     */
    public function getZipcode(): string
    {
        return $this->zipcode;
    }

    /**
     * @param string $zipcode
     */
    public function setZipcode(string $zipcode): void
    {
        $this->zipcode = $zipcode;
    }

    /**
     * @return string
     */
    public function getCity(): string
    {
        return $this->city;
    }

    /**
     * @param string $city
     */
    public function setCity(string $city): void
    {
        $this->city = $city;
    }

    /**
     * @return string
     */
    public function getDescription(): string
    {
        return $this->description;
    }

    /**
     * @param string $description
     */
    public function setDescription(string $description): void
    {
        $this->description = $description;
    }
    /**</h2>
     * @var string
     *
     * @ORM\Column(name="lat", type="decimal", precision=10, scale=8, nullable=false)
     */
    private $lat;

    /**
     * @var string
     *
     * @ORM\Column(name="lng", type="decimal", precision=10, scale=8, nullable=false)
     */
    private $lng;

    /**
     * @var string
     *
     * @ORM\Column(name="street", type="string", length=255, nullable=false)
     */
    private $street;

    /**
     * @var string
     *
     * @ORM\Column(name="zipcode", type="string", length=5, nullable=false)
     */
    private $zipcode;

    /**
     * @var string
     *
     * @ORM\Column(name="city", type="string", length=255, nullable=false)
     */
    private $city;

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", nullable=false)
     */
    private $description;

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;


}
Run Code Online (Sandbox Code Playgroud)

包含一行数据的表:

在此输入图像描述

在此输入图像描述

我收到了这个错误:

"type":" https://tools.ietf.org/html/rfc2616#section-10 ","title":"发生错误","详细信息":"输入错误:App\Entity\Address的返回值:: getLat()必须是string类型,返回null",

在此输入图像描述

我的错在哪里?使用Symfony 4.0.

Tob*_* Xy 16

getter getLat具有返回类型提示string,这意味着只接受实际字符串值(这也意味着:没有空值!)作为返回值.

您没有显示实际使用实体的代码,但它基本上归结为对象中每个属性的默认值,null如果没有不同的定义.

看看这个例子:

$address = new Address();

// the following lines will produce an error in your example
// because your return type hint doesn't allow null values

$address->getId();     // returns null
$address->getStreet(); // returns null
$address->getLat();    // returns null

$address->setLat("4.56789");

$address->getLat();   // returns "4.56789"
Run Code Online (Sandbox Code Playgroud)

关于学说的说明:

如果数据库中的值设置正确,则在Doctrine填充实体后(例如,通过$address = $addressRepo->find(123);),您将不会遇到此问题.只有在您自己创建新实体然后尝试使用getter方法时才会发生这种情况.

可能的解决方案:

1.)允许空值作为返回值.使用问号添加返回类型提示,如下所示:

/**
 * @return string|null
 */
public function getLat(): ?string
{
    return $this->lat;
}
Run Code Online (Sandbox Code Playgroud)

但是如果你这样做,你的代码必须准备好处理来自这些方法的空值!

2.)在对象中使用正确的数据类型定义默认值:

/**
 * @var string
 *
 * @ORM\Column(name="lat", type="decimal", precision=10, scale=8, nullable=false)
 */
private $lat = "";
Run Code Online (Sandbox Code Playgroud)

您的代码必须准备好处理空字符串作为返回值然后!或者,您也可以在构造函数方法中定义默认值.

3.)通过使它们成为构造函数的参数,要求这些属性可用:

public function __constructor(string $lat, string $lng /*, add the other required properties */) {
    $this->lat = $lat;
    $this->lng = $lng;
    // ... additional properties here ...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须在创建对象时提供值new Address(/* parameters go here */);.