Apa yang menyebabkan kesalahan berikut: Peringatan: Offset string ilegal 'is_in_stock' ... AdvancedInventory.php on line 87

8

Selama pengembangan modul, saya telah menulis sebuah plugin yang mengubah koleksi opsi produk sebelum dimuat (menambahkan bidang deskripsi). Ini dia:

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>

Kode:

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

Semuanya tampak baik-baik saja, tapi ... Ketika saya mencoba memuat halaman edit produk yang ada (di backend) saya melihat kesalahan berikut:

Peringatan: Offset string ilegal 'is_in_stock' di [...] / vendor / magento / module-catalog-inventory / Ui / DataProvider / Produk / Form / Modifier / AdvancedInventory.php pada baris 87

Jika saya melakukan perubahan seperti yang ditunjukkan dalam dokumen (diatur opcache.save_comments = 1di dalam konfigurasi php-fpm milik saya) semuanya berfungsi dengan baik. Tapi saya tidak bisa mengerti, kode mana yang menyebabkan kesalahan di atas dan bagaimana saya bisa mencegahnya tanpa konfigurasi modifikasi?

Siarhey Uchukhlebau
sumber

Jawaban:

2

The ExtensionAttributesFactory(dan tidak hanya ) menggunakan dockblock untuk menentukan "barang". (belum yakin apa sebenarnya).
Jika Anda menggunakan cache OP, ini berarti file php Anda akan di-cache, diperkecil, dan mungkin akan mengalami modifikasi lainnya.
Secara default opcache tidak menyimpan komentar dalam versi yang diperkecil sehingga $methodDocBlock = $methodReflection->getDocComment();akan kembali nulldan tidak ada cara untuk mengetahui data meta tentang metode dalam antarmuka tertentu.

Saya tahu itu bukan jawaban lengkap, tetapi idenya ada di sini. Magento menggunakan dockblock untuk menemukan meta data tentang metode sehingga Anda harus menyimpannya.

Marius
sumber
Terima kasih atas jawaban Anda. Saya pikir ini berarti bahwa saya tidak dapat mencegah kesalahan ini tanpa modifikasi konfigurasi.
Siarhey Uchukhlebau