Was verursacht den folgenden Fehler: Warnung: Unzulässiger String-Offset 'is_in_stock'… AdvancedInventory.php in Zeile 87

8

Während der Modulentwicklung habe ich ein Plugin geschrieben, das die Produktoptionssammlung vor dem Laden ändert (fügt ein Beschreibungsfeld hinzu). Hier ist 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>

Code:

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

Alles scheint in Ordnung zu sein, aber ... Wenn ich versuche, die vorhandene Produktbearbeitungsseite (im Backend) zu laden, wird der folgende Fehler angezeigt:

Warnung: Unzulässiger String-Offset 'is_in_stock' in [...] / vendor / magento / module-catalog-inventar / Ui / DataProvider / Product / Form / Modifier / AdvancedInventory.php in Zeile 87

Falls ich Änderungen vornehme, wie in den Dokumenten angegeben ( opcache.save_comments = 1in meiner PHP-Fpm-Konfiguration festgelegt), funktioniert alles einwandfrei. Aber ich kann nicht verstehen, welcher Code den obigen Fehler verursacht und wie kann ich ihn ohne Konfigurationsänderungen verhindern?

Siarhey Uchukhlebau
quelle

Antworten:

2

Der ExtensionAttributesFactory(und nicht nur ) verwendet die Dockblocks , um "Zeug" zu bestimmen. (noch nicht sicher was genau).
Wenn Sie den OP-Cache verwenden, bedeutet dies, dass Ihre PHP-Dateien zwischengespeichert und minimiert werden und wahrscheinlich andere Änderungen erfahren.
Standardmäßig speichert der Opcache die Kommentare nicht in der minimierten Version und kehrt daher $methodDocBlock = $methodReflection->getDocComment();zurück. nullEs gibt keine Möglichkeit, Metadaten zu den Methoden in einer bestimmten Schnittstelle herauszufinden.

Ich weiß, dass es keine vollständige Antwort ist, aber die Idee ist hier drin. Magento verwendet die Dockblocks, um Metadaten zu Methoden herauszufinden, sodass Sie diese behalten müssen.

Marius
quelle
Vielen Dank für Ihre Antwort. Ich denke, dies bedeutet, dass ich diesen Fehler ohne Konfigurationsänderungen nicht verhindern kann.
Siarhey Uchukhlebau