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

时间:2018-02-13 16:29:19

标签: 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;


}

包含一行数据的表格:

enter image description here

enter image description here

我收到了这个错误:

  
    

&#34;输入&#34;:&#34; https://tools.ietf.org/html/rfc2616#section-10&#34;,       &#34; title&#34;:&#34;发生错误&#34;,       &#34; detail&#34;:&#34;类型错误:App \ Entity \ Address :: getLat()的返回值必须是string类型,返回null&#34;,

  

enter image description here

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

2 个答案:

答案 0 :(得分:15)

getter getLat的返回类型为hint 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"

有关学说的说明:

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

可能的解决方案:

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

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

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

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

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

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

3。)通过使这些属性成为构造函数的参数来要求这些属性可用:

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

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

答案 1 :(得分:-1)

Symfony 5:

public function getSomething(): ?string
    {
        return $this->something;
    }

    public function setSomething(string $something): self
    {
        $this->something= $something;

        return $this;
    }

只需像这样从(string $ something)中删除字符串,它应该可以工作,对我有用

public function getSomething(): ?string
        {
            return $this->something;
        }
    
        public function setSomething($something): self
        {
            $this->something= $something;
    
            return $this;
        }