Qué causa el siguiente error: Advertencia: desplazamiento de cadena ilegal 'is_in_stock'… AdvancedInventory.php en la línea 87

8

Durante el desarrollo del módulo, he estado escribiendo un complemento que modifica la colección de opciones del producto antes de que se cargue (agrega un campo de descripción). Aquí es:

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>

Código:

<?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();
    }
}

Todo parece estar bien, pero ... Cuando trato de cargar la página de edición del producto existente (en el backend) veo el siguiente error:

Advertencia: desplazamiento de cadena ilegal 'is_in_stock' en [...] / vendor / magento / module-catalog-Inventory / Ui / DataProvider / Product / Form / Modifier / AdvancedInventory.php en la línea 87

En caso de que haga cambios como se indica en los documentos (establecido opcache.save_comments = 1dentro de mi configuración php-fpm) todo funciona bien. Pero no puedo entender, ¿qué código causa el error anterior y cómo puedo evitarlo sin modificaciones de configuración?

Siarhey Uchukhlebau
fuente

Respuestas:

2

El ExtensionAttributesFactory(y no solo ) usa los bloques de acoplamiento para determinar "cosas". (Todavía no estoy seguro de qué exactamente).
Si usa caché OP, esto significa que sus archivos php se almacenarán en caché, se minificarán y probablemente sufrirán otras modificaciones.
De forma predeterminada, el opcache no guarda los comentarios en la versión minimizada, por $methodDocBlock = $methodReflection->getDocComment();lo que volverá nully no hay forma de encontrar metadatos sobre los métodos en una determinada interfaz.

Sé que no es una respuesta completa, pero la idea está aquí. Magento usa los dockblocks para encontrar metadatos sobre métodos, por lo que debe conservarlos.

Marius
fuente
Gracias por su respuesta. Creo que esto significa que no puedo evitar este error sin modificaciones de configuración.
Siarhey Uchukhlebau