а какие недостатки могут возникнуть если убрать строгий тайпхинт? В документациях всегда они присутствуют.
Да и Доктрина их сома всегда генерирует
и как можно быстро получить в контроллере верный тип?
А может лучше сначала ициализировать Pic, даже если из бд пришел null, только правильно это обработать? А то как-то неправильно получается, в setPic ты ожидаешь Pic, а вместо него прилетает null, и ты потом этим null инициализируешь, а потом тебе еще каждый раз проверять на null. Как-то это все не очень выглядит.
Разве что тебя это не должно заботить что там дальше будет с объектом. Но тогда можно просто написать public function setPic($pic), а в доках к функции указать тип для значения, чтоб IDE все понимала, и не парить себе мозги.
У вас есть информация о том что автору вопроса обязательно нужен Pic?
как-то неправильно получается, в setPic ты ожидаешь Pic, а вместо него прилетает null,
откуда у вас такие сведения, что в setPic он ожидает Pic? Если он хочет удалить Pic для Hotel, пусть делает setPic(null);
Null это корректное значение для отсутствия записей. Или отели не бывают без картинок?
Return value of MyBundle\HotelBundle\Model\Hotel::getPics() must be an instance of MyBundle\HotelBundle\Model\Pic or null, instance of Doctrine\ORM\PersistentCollection returned
symnoob, для начала вы должны определиться:
Pics это много картинок?
или Pics это одна картинка?
Если одна, то вам не нужно было брать коллекцию для этого поля. (у вас видимо указана связь многие к одному)
Коллекция - это когда много. И строгого тайпхинта на Pics у коллекции быть не должно
Для коллекций нужен несколько другой набор методов:
addPic(Pic $pic) //добавить одну картинку
removePic(Pic $pic) //удалить одну (конкретную) картинку
setPics(Collection $pics);
getPics() : ? Collection;
Я вам смогу помочь если вы приведете полный код своих сущностей - отеля и картинки. Чтобы я увидел связи между ними.
protected $pics;
public function __construct(string $id)
{
$this->id = $id;
$this->pics = new ArrayCollection();
public function addPic(? Collection $pics)
{
$this->pics[] = $pics;
return $this;
}
public function removePic($pics)
{
$this->pics->removeElement($pics);
}
public function getPics(): ? Collection
{
return $this->pics;
}
Pic Entitty:
protected $hotel;
public function setHotel($hotel)
{
$this->hotel = $hotel;
return $this;
}
public function getHotel()
{
return $this->hotel;
}
IDE правильно подсказывает, я вам дал неполную информацию
Hotel:
protected $pics;
// вы уверены что тип у айди - стринг? и что его надо передавать в конструктор?
public function __construct(string $id)
{
$this->id = $id;
$this->pics = new ArrayCollection();
}
// здесь элемент должен быть строго экземпляром класса Pic, потому что вы знаете какой элемент хотите добавить и вы не хотите добавлять "пустые" картинки
/**
* Add pic
*
* @param Pic $pic
*/
public function addPic(Pic $pic)
{
if (! $this->pics->contains($pic)) {
$this->pics[] = $pic;
}
}
// здесь элемент должен быть строго экземпляром класса Pic, потому что вы знаете какой элемент хотите удалить
public function removePic(Pic $pic)
{
$this->pics->removeElement($pics);
}
// можете получить null, если не проинициализируете поле по умолчанию в конструкторе. Но обычно вы будете получать этим методом список картинок которые есть у отеля
public function getPics(): ? ArrayCollection
{
return $this->pics;
}
// можете передать null, либо, если угодно, пустую коллекцию - чтобы удалить сразу все картинки.
// в иных случаях вы знаете что должны передать всю коллекцию картинок за раз.
public function setPics(? ArrayCollection $pics)
{
$this->pics = $pics;
}
Return value of MyBundle\\HotelBundle\\Model\\Hotel::getPics() must be an instance of Doctrine\\Common\\Collections\\ArrayCollection or null, instance of Doctrine\\ORM\\PersistentCollection returned