Update auf SW 5.5, Problem mit "cdn"-Konfiguration "strategy"

Hi,

nach dem Update auf Version 5.5 gestern kam mein Shop nicht mehr hoch. (Wir sind noch in der Testphase zum Glück).

 PHP Fatal error: Uncaught Symfony\\Component\\OptionsResolver\\Exception\\UndefinedOptionsException: The option "strategy" does not exist. Defined options are: "dir", "file", "mediaUrl", "permissions", "root", "type", "url". in /xxx/shopware/vendor/symfony/options-resolver/OptionsResolver.php:667 Stack trace: #0 /xxx/shopware/engine/Shopware/Bundle/MediaBundle/Adapters/LocalAdapterFactory.php(86): Symfony\\Component\\OptionsResolver\\OptionsResolver-\>resolve(Array) #1 /xxx/shopware/engine/Shopware/Bundle/MediaBundle/Adapters/LocalAdapterFactory.php(44): Shopware\\Bundle\\MediaBundle\\Adapters\\LocalAdapterFactory-\>resolveOptions(Array) #2 /xxx/shopware/engine/Shopware/Bundle/MediaBundle/MediaServiceFactory.php(127): Shopware\\Bundle\\MediaBundle\\Adapters\\LocalAdapterFactory-\>create(Array) #3 /xxx/shopware/engine/Shopware/Bundle/MediaBundle/Me... 

Scheinbar ist die Möglichkeit, eine Strategie festzulegen, wie hier (MediaService) angegeben, rausgefallen? Bei uns funktioniert die Plain-Strategie gut und ich möchte diese aus diversen Gründen (die NICHT Gegenstand der Diskussion hier sind) beibehalten. An sich scheint die ja auch im Code noch zu exisiteren. Ich habe mir jetzt auf die Schnelle damit beholfen, die entsprechende Überprüfung auszukommentieren. Ob das sonderlich schlau ist und/oder den gewünschten Effekt hat, habe ich noch nicht verifiziert, aber so ist der Shop erstmal wieder benutzbar.

Jetzt meine Frage: Wie ist denn nun der Status damit? War das ein versehen und ist somit ein Bug? War das Absicht und ich müsste das sauber selbst “nachprogrammieren”?

Danke schonmal,

Alex

Hallo @daboss‍,

vermutlich ist das ein Versehen weil ein “downgrade” auf die plain-Strategie ein nicht berücksichtiger Use-Case war.

EDIT:

Bitte versuche mal in der config.php die ‘strategy’ => ‘plain’ Angabe direkt in den ‘cdn’-Key zu legen, das könnte Dein Problem auch schon beheben!

EDIT ENDE

Als Quickfix würde ich vorschlagen in der Datei engine/Shopware/Bundle/MediaBundle/Adapters/LocalAdapterFactory.php die Methode resolveOptions() (Zeile 67ff) durch folgenden Inhalt zu ersetzen:

    private function resolveOptions(array $config)
    {
        $options = new OptionsResolver();

        $options->setRequired(['root']);
        $options->setDefined(['file', 'dir', 'mediaUrl', 'type', 'permissions', 'url', 'strategy']);

        $options->setAllowedTypes('root', 'string');
        $options->setAllowedTypes('strategy', 'string');
        $options->setAllowedTypes('file', 'array');
        $options->setAllowedTypes('dir', 'array');
        $options->setAllowedTypes('mediaUrl', 'string');
        $options->setAllowedTypes('type', 'string');
        $options->setAllowedTypes('permissions', 'array');

        $options->setDefault('file', []);
        $options->setDefault('dir', []);

        $config = $options->resolve($config);
        $config['file'] = $this->resolveFilePermissions($config['file']);
        $config['dir'] = $this->resolveDirectoryPermissions($config['dir']);

        return $config;
    }

Sollte das Dein Problem beheben würde ich mich über ein kurzes Feedback freuen!

Okay, ich habe deine Codelösung ersetzt, funktionert soweit ich das im Moment sehe. Danke!

Die Lösung mit “‘strategy’=>‘plain’ direkt in den ‘cdn’-Key legen” habe ich nicht verstanden. Wie würde das fertig ausschauen?

Laut Doku sollte die config.php wie folgt aussehen, der „strategy“-key steht dabei unterhalb von „adapter“:

'cdn' => [
    'adapters' => [
        'local' => [
            'type' => 'local',
            'mediaUrl' => '',
            'strategy' => 'plain',
            'path' => realpath( __DIR__. '/'),
            'permissions' => [
                'file' => [
                    'public' => 0666 & ~umask(),
                    'private' => 0600 & ~umask(),
                ],
                'dir' => [
                    'public' => 0777 & ~umask(),
                    'private' => 0700 & ~umask(),
                ]
            ],
        ],
...

Ich konnte das gleiche Ergebnis ohne die beschriebene Code-Änderung erreichen in dem ich einfach den „strategy“ key in der Hierarchie nach oben verschoben habe:

'cdn' => [
    
    'strategy' => 'plain',
    
    'adapters' => [
        'local' => [
            'type' => 'local',
            'mediaUrl' => '',
            'path' => realpath( __DIR__. '/'),
            'permissions' => [
                'file' => [
                    'public' => 0666 & ~umask(),
                    'private' => 0600 & ~umask(),
                ],
                'dir' => [
                    'public' => 0777 & ~umask(),
                    'private' => 0700 & ~umask(),
                ]
            ],
        ],
...

Ahja, so war das gemeint… OK, funktioniert hier scheinbar auch. Dann bevorzuge ich diese Lösung, weil keine Core-Änderungen (oder Plugin) nötig sind.

… solltet ihr in euer Doku auch anpassen :slight_smile:

Achso: Gilt das auf diese Weise dann für alle konfigurierten Adapter? Und macht das dann keine Probleme, wenn man doch mal umstellen will z.Bsp. mit dem Befehl aus der verlinkten Anleitung? (Ist zwar, wie gesagt, erstmal nicht unser Plan, aber wer weiß)

 

Freut mich dass es funktioniert, das würde ich dann nämlich wie Du schon sagst in die Doku überführen lassen. Zuvor müssen wir das aber noch mit den anderen Adaptern testen, wenn ich nicht völlig falsch liege ist dieses „strategy“-Thema nur relevant für die lokalen Bilder. 

Danke für Dein Feedback!

Hallo,

ich wurde mit meiner Fehlermeldung auf diesen Beitrag verwiesen. Habe die Änderung in der config.php vorgenommen und konnte mir recovery/update das Update fertig durchlaufen lassen. Shop und Backend sind wieder erreichbar.

Bisher habe ich das in zwei Testinstallationen gemacht, an den Live-Shop hab ich mich noch nicht getraut. Denn auch wenn die anderen Shops wieder erreichbar sind, könnte es Fehler geben, die ich so direkt nicht feststellen kann.

Daher die Frage:

Was ist die Ursache dieses Fehlers?

Warum taucht der scheinbar nur bei einigen Shops auf, nicht bei allen?

Kann sich die Versetzung von 'strategy' => 'plain', auf auf andere Bereiche auswirken?

LG

 

Mir ist noch nicht wieder was negativ aufgefallen. Shopware testet das aber auch noch selbst gegen, wenn ich das oben richtig verstanden habe. Dauert wahrscheinlich nur noch etwas, weil die Doku dazu ist scheinbar noch nicht aktualisiert. Mögliche unklare Seiteneffekte sind oben ja aufgeführt (z.B. Wechsel des Adapters)

Wenn du die Quellcode-Datei anstelle der Config änderst, hast du, soweit ich das überblickt habe, wieder genau das gleiche verhalten, wie vor dem Update. Das solltest du aber für alle folgenden Updates dringend im Hinterkopf behalten (ein Grund, warum man sowas normalerweise eher nicht macht!) Dafür sollte es meiner Meinung nach sonst keine Seiteneffekte haben.

Hm, nun ist es ja so, dass ich hier quasi überhaupt nichts verstehe :wink: Keine Ahnung, was ein Adapter in diesem Fall ist oder macht und was es mit der Strategie auf sich hat.

Ich habe, wie gesagt, die Änderung in der Config gemacht. Bisher habe ich an dieser Datei noch nie etwas (manuell) geändert. Daher war ich auch der Meinung, dass diese Datei oder zumindest der hier genannte Teil bei den meisten Nutzern so vorhanden sein müsste und dann eben auch den Fehler beim update produziert.

 

NACHTRAG

Nun habe ich testweise nach dem update die config wieder zurückgeändert. Also strategy wieder an Ursprungsposition. Shop und Backend scheinen noch zu laufen.

@Toric schrieb:

Hm, nun ist es ja so, dass ich hier quasi überhaupt nichts verstehe :wink: Keine Ahnung, was ein Adapter in diesem Fall ist oder macht und was es mit der Strategie auf sich hat.

Naja die Änderungen hast du ja dort eingetragen :wink:
Das ist für die Nutzung der alten Media-Pfade, also alles in einem Verzeichnis. Da hat sich mit dem Update etwas an der config geändert. Wenn du das umträgst läuft das ja erstmal für dich. 

@Moritz Naczenski schrieb:

Naja die Änderungen hast du ja dort eingetragen ;)

Das ist für die Nutzung der alten Media-Pfade, also alles in einem Verzeichnis. Da hat sich mit dem Update etwas an der config geändert. Wenn du das umträgst läuft das ja erstmal für dich. 

Ich selbst hab da nur die Änderung wie oben beschrieben vorgenommen.

Wenn allerdings diese Umstellung auf „alle Bilder in einem Verzeichnis“ auch eine Änderung der config.php erfordert, dann ist die Datei tatsächlich nicht mehr Original gewesen. Die Umstellung habe ich seinerzeit machen lassen von jemandem, der weiß was er tut ;-).

Ist es dann aber nicht ungewöhnlich, dass ich nach erfolgtem Update die Zeile in der config wieder an die alte Stelle setzen kann und es trotzdem läuft?

Guten Abend,

wie sähe die config.php für Amazon, bzw. speziell für Cloudfront aus? Hier waren bisher im S3-Adapter (Plugin) Angaben zu machen wie key, secret usw. Wo gehören die nun hin?

Vielen Dank!

Schau dir einfach mal shopware/Default.php at 5.5 · shopware/shopware · GitHub an. Dann siehst du alles mögliche :slight_smile:

PS: Ab 5.5 wird das S3 Plugin nicht mehr benötigt

1 „Gefällt mir“