Beiträge von Danaq

    Hallo,


    ich habe ein Laravel 8.12 (Php 7.4.14) und seit ein paar Tagen bekomme ich Fehler beim Aufruf eines Seeders aus einem Subdirectory über einen Artisan::call-Befehl.


    Ich kann den Seeder über die Bash wie gewohlt aufrufen und der Befehl läuft durch.
    php artisan db:seed --class=Database\\Seeders\\Testing\\StagingTestDataSeeder


    Aber wenn ich versuche dieselbe Syntax als Artisan::call aufzurufen,


    Code
    Artisan::call("db:seed --class=Database\\Seeders\\Testing\\StagingTestDataSeeder");


    bekomme ich Target class [Database\\Seeders\\DatabaseSeedersTestingStagingTestDataSeeder] does not exist. als Fehler.

    Wenn er versucht das was in der Fehlermeldung steht umzusetzen ist auch klar warum das nicht geht, denn den namespace den er da versucht aufzurufen gibt es natürlich nicht.


    Da der Aufruf über die Bash geht, schließe ich Fehler im namespace oder der Filelocation aus.


    Jetzt habe ich mal ein paar Daten in SeederCommand.php::getSeeder() ausgegeben:



    was diese Ausgabe gibt:



    Code
    array:2 [▼
    "command" => "db:seed"
    "class" => null
    ]
    Code
    "DatabaseSeedersTestingStagingTestDataSeeder"


    Aus irgendeinem Grund kommen die Backslashes nicht bis in die verarbeitende Methode mit.

    Ich weiß auch, dass ich über PHP und require die Klasse einbinden kann oder den deep-namespace in die composer.json eintragen könnte, allerdings wollte ich das mit laravel-boardmitteln lösen und vor ein paar Tagen lief es wie gesagt ja auch noch.


    ---- ein paar Tests später ----

    2 Lösungen habe ich jetzt gefunden:


    1. Ich kann das Argument für das Command als "Option" mit "--class=") oder "Argument" (nur den FQ-Namespace) übergeben.
      Damit funktioniert diese Schreibweise jetzt auch im Artisan::call:
      Artisan::call("db:seed Database\\\\Seeders\\\\Testing\\\\StagingTestDataSeeder");
    2. Nach der Laravel-8-Doku können Argumente als Array übergeben werden:
      Artisan::call('db:seed', ['--class' => 'Database\Seeders\Testing\StagingTestDataSeeder']); --> funktioniert demnach jetzt auch.


    Evtl. kann aber trotzdem jemand erklären, was da passiert. Bisher habe ich die Angabe der Seeder-Klasse in der Bash und als Artisan::call immer identisch gemacht und es funktionierte auch mit Subdirectories (dann immer als full-qualified-namespace).

    Jetzt sieht es aber so auch als wenn die Angabe der Seeder-Klasse als "--class=...." 2x verarbeitet wird und deshalb die escapten Backslashed nicht mehr da sind wenn dann die eigentliche Klasse geladen werden soll.

    Gab es da irgendeine Änderung? Soll das so?


    Viele Dank für die Hilfe.