Что вызывает следующую ошибку: Предупреждение: Недопустимое смещение строки "есть в наличии" … AdvancedInventory.php на линии 87


Во время разработки модуля я писал плагин, который изменяет коллекцию опций продукта до ее загрузки (добавляет поле описания). Вот оно:

Etc/di.xml

<type name="Magento\Catalog\Model\ResourceModel\Product\Option\Collection">
    <plugin name="addOptionDescription" type="Vendor\Module\Plugin\Product\Option\Collection" sortOrder="10" disabled="false"/>
</type>

Код:

<?php
namespace Vendor\Module\Plugin\Product\Option;

use Vendor\Module\Model\OptionDescription;
use Magento\Catalog\Model\ResourceModel\Product\Option\Collection as OptionCollection;

class Collection
{
    /**
     * @var \Vendor\Module\Helper\Data
     */
    protected $helper;

    public function __construct(
        \Vendor\Module\Helper\Data $helper
    ) {
        $this->helper = $helper;
    }

    /**
     * @param OptionCollection $subject
     * @param bool $printQuery
     * @param bool $logQuery
     * @return array
     */
    public function beforeLoad($subject, $printQuery = false, $logQuery = false)
    {
        if (!$subject->isLoaded()) {
            $this->addDescriptionToResult($subject);
        }

        return [$printQuery, $logQuery];
    }

    /**
     * Add description to result
     *
     * If yo get error message "Warning: Illegal string offset 'is_in_stock' ... "
     * @see http://devdocs.magento.com/guides/v2.0/install-gde/trouble/php/tshoot_opcache.html
     *
     * @param OptionCollection $collection
     * @return OptionCollection $collection
     */
    private function addDescriptionToResult($collection)
    {
        $tableName = OptionDescription::TABLE_NAME;
        $joinDescriptionExpr = 'main_table.unique_option_id = option_description.unique_option_id AND option_description.store_id = 0';

        $collection->getSelect()->joinLeft(
            ['option_description' => $tableName],
            $joinDescriptionExpr,
            ['description' => 'description']
        );

        return $collection;
    }

    /**
     * Resolve current store id
     *
     * @return int
     */
    protected function getStoreId()
    {
        return $this->helper->resolveCurrentStoreId();
    }
}

Вроде бы все в порядке, но... Когда я пытаюсь загрузить существующую страницу редактирования продукта (на серверной части) Я вижу следующую ошибку:

Предупреждение: Недопустимое смещение строки "is_in_stock" в [...]/поставщик/ magento/модуль-каталог-инвентарь/Пользовательский интерфейс/Поставщик данных/Продукт/Форма/ Modifier/AdvancedInventory.php в строке 87

В случае, если я внесу изменения , как указано в документах (установите opcache.save_comments = 1 внутри моей конфигурации php-fpm), все работает нормально. Но я не могу понять, какой код вызывает приведенную выше ошибку и как я могу предотвратить ее без изменений конфигурации ?

Author: Siarhey Uchukhlebau, 2017-06-30

1 answers

ExtensionAttributesFactory не только) использует dockblocks для определения "материала". (пока не уверен, что именно).
Если вы используете кэш OP, это означает, что ваши php-файлы будут кэшированы, уменьшены и, вероятно, будут подвергнуты другим модификациям.
По умолчанию opcache не сохраняет комментарии в уменьшенной версии, поэтому $methodDocBlock = $methodReflection->getDocComment(); вернет null, и нет способа узнать метаданные о методах в определенном интерфейсе.

Я знаю, что это не полный ответ, но идея находится здесь. Magento использует dockblocks для поиска метаданных о методах, поэтому вам необходимо их сохранить.

 2
Author: Marius, 2017-07-10 10:56:19