Разрешить нулевые значения в инвертированном объекте ManyToOne

У меня есть эта сущность:

class Brand
{
    ...

    /**
     * @var Company
     * @ORM\ManyToOne(targetEntity="Company", inversedBy="brands")
     * @ORM\JoinColumn(name="companies_id", referencedColumnName="id", nullable=true)
     */
    protected $company;

    ...

    /**
     * Set company.
     *
     * @param Company $company
     *
     * @return Brands
     */
    public function setCompany(Company $company)
    {
        $this->company = $company;
        return $this;
    }
}

Если я удалю подсказку типа Company из подписи метода, я получу эту ошибку:

Уловимая фатальная ошибка: аргумент 1, переданный в AppBundle\Entity\Brand::setCompany(), должен быть экземпляром AppBundleEntity\Company, заданным null, вызываемым в /var/www/html/backend/vendor/symfony/symfony/src/Symfony /Component/PropertyAccess/PropertyAccessor.php в строке 410 и определено

Я установил для свойства значение nullable, но не могу удалить объект из данных, почему? Как это можно исправить?


person ReynierPM    schedule 13.08.2015    source источник
comment
Это похоже на проблему с кэшированием. Ошибка в методе, который вы сказали, что изменили. Если вы используете что-то вроде Zend OPCache, попробуйте перезапустить/отключить его. Похоже, что используется старое определение класса. Примечание: вы также можете сделать setCompany(Company $company=null), чтобы сохранить безопасность типов и разрешить нули.   -  person Anonymous    schedule 13.08.2015
comment
@Anonymous, это работает, я только что перезапустил свой веб-сервер и очистил кеш (я был очищен ранее), и все хорошо, спасибо, кстати, как мне узнать, использую ли я какой-либо кеш?   -  person ReynierPM    schedule 13.08.2015
comment
Я напишу полный ответ через минуту.   -  person Anonymous    schedule 13.08.2015


Ответы (2)


Это похоже на проблему с кэшированием. Ошибка в методе, который вы сказали, что изменили. Если вы используете что-то вроде Zend OPCache, попробуйте перезапустить/отключить его. Похоже, что используется старое определение класса.

Примечание. вы также можете выполнить setCompany(Company $company=null), чтобы сохранить безопасность типов и разрешить пустые значения (PHP 5.1+).


Самый простой способ проверить, что вы включили, — это проверить вывод phpinfo(). Если вы используете OPCache, вы увидите его там. Вот конфигурация моей среды разработки (в php.ini):

[OPCACHE]
zend_extension="php_opcache.dll"
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=0
opcache.fast_shutdown=1
opcache.enable_cli=1
opcache.validate_timestamps=1

Последняя опция является важной — она перечитывает все файлы, которые были обновлены. В производственной среде вы бы хотели установить его равным нулю (и opcache.revalidate_freq равным нулю), чтобы уменьшить доступ к диску. Дополнительные настройки см. здесь.

Хотя такие вещи, как APC, все еще работают, встроенный Zend OPCache — это то, что нужно для PHP 5.5+, поэтому я рекомендую переключиться, если можете.

person Anonymous    schedule 13.08.2015

Просто измените метод setCompany, как указано ниже.

public function setCompany(Company $company=null)
{
    $this->company = $company;
    return $this;
}
person Praveesh    schedule 13.08.2015