Exception beim Import von Kategorien -> Maximum function nesting level reached

Hi zusammen,

Ich habe einen CLI Importer geschrieben, der Kategorien aus einem XML ausliest und anleg bzw. aktualisiert. Das funktioniert gut, solange ich nicht explizit eine ID für die Kategorie vorgebe. Ist eine Kategorie ID angegeben, legt Shopware die ersten 5 Kategorien problemlos an um danach ich eine Exception zu laufen:

Maximum function nesting level of ‚256‘ reached, aborting! in /engine/Shopware/Components/Model/CategoryDenormalization.php on line 77

Selbst wenn ich das nesting level auf 1024 erhöhe, kommt es zum selben Fehler - dauert halt nur länger.

Hier die Methode, die ich zum Importieren einsetze:

/**
 * @param $xml
 * Import the product categories from SPM
 */
public function importCategoriesSpm($xml)
{

    // Get the ressource
    $categoryResource = \Shopware\Components\Api\Manager::getResource('category');

    // Iterate over all post nodes in XML
    foreach ($xml->category as $category):

        // Find out the attributes
        $attributes = $category->attributes();
        $categoryId = $attributes['id'];

        // @TODO: Skipping this item if the category ID = 3 (shopware default)
        if ($categoryId==3) continue;

        // Map the parent ID
        $parentId = 3;
        if($attributes['parent_id'] != '0'):
            $parentId = $attributes['parent_id'];
        endif;

        $categoryData = array(
            'parentId' => 3,
            'name' => $category->name,
            'cmsHeadline' => $category->name,
            'cmsText' => $category->subtitle,
            'metaDescription' => $category->subtitle,
            'active' => true,
            'showFilterGroup' => true
        );

        try {
            $category = $categoryResource->update($categoryId, $categoryData);
            $this->log('success', 'Category "'.$category->getName().'" successfully updated.');
        } catch (\Shopware\Components\Api\Exception\NotFoundException $e) {
            $categoryData['id'] = (int) $categoryId;
            $category = $categoryResource->create($categoryData);
            $this->log('success', 'Category "'.$category->getName().'" successfully imported.');
        }

    endforeach;

}

Sobald ich die Category ID nicht setze, läuft der Importer wunderbar. Allerdings würde ich gerne die ID selbst bestimmen um mir das einführen eine Referenz-ID zu ersparen.

Danke für Eure Inputs vorweg,
LG

Irgendwie hab ich in Erinnerung, dass der Fehler von xDebug kommt. Hast du das an?

Siehe: http://stackoverflow.com/questions/4293775/increasing-nesting-functions-calls-limit

1 „Gefällt mir“

Darauf bezieht sich mein Satz mit der Erhöhung des Nesting Levels auf 1024. Er versucht dennoch redundant diese Methode aufzurufen… Dann halt nicht nur 256 mal sondern bei meinem letzten Test 10.000 mal. Dauert dann halt deutlich länger bis er in den Timeout läuft.

Wenn xdebug komplett deaktiviert ist, läuft er einfach in einen PHP Script Timeout… XDebug ist also nicht die grundlegende Ursache.

Diese Methode dürfte das Problem verursachen:
Shopware\Components\Model\CategoryDenormalization->getParentCategoryIds() /data/www/www.apobag.dev/engine/Shopware/Components/Model/CategoryDenormalization.php:136

Diese rekursive Funktion dürfte bei bestimmten ID´s in eine Endlosschleife gelangen. Ich versuche das jetzt mal nachzuvollziehen.

Ok, Problem gefunden. Grund war, das er eine Kategorie mit ID 1 importiert hatte - die ist aber in Shopware für die ROOT-Kategorie reserviert.