Laravel 12 Maintenance Mode

  • Hey,

    ich habe da ein nerviges Dauerthema in meinem Kopf was mir keine Ruhe lässt. Ich habe in meinem Admin Bereich ein Toggle für Wartungsarbeiten. Dieser Toggle setzt quasi per php den Befehl

    Code
    Artisan::call('down');

    ab. In meiner app.php habe ich einige Ausnahmen von Routen bzw URL definiert welche auch einwandfrei klappen.

    Nutze ich aber als Befehl zb.

    Code
    Artisan::call('down', [
    '--render' => 'errors::503',
    ]);

    greift zwar der Wartungsmodus, wird also ausgelöst allerdings greifen die von mir definierten URL Ausnahmen nicht mehr.

    Sobald --render wieder rausfliegt, klappt alles einwandfrei.

    Meine Frage: Kennt jemand eine zuverlässige Methode dieses Problem so zu lösen dss ich --render nutzen kann UND trotzdem die Ausnahmen greifen?

    app.php ->

    Code
    $middleware->preventRequestsDuringMaintenance(except: [ 
      '/auth/*',
      '/control/*',
      '/lang/*'
    ]);

    Liebe Grüsse

  • Naja klar könnte ich das bestimmt auch mit einem separaten Wartungsmodus lösen aber ich möchte gerne Artisan dazu nutzen.

    Möglich wäre ein Middleware die prüft ob ein "Wartungsmodus" aktiviert wäre und dann jeden quasi auf eine 503 leitet .. warum aber so umständlich wenn laravel das von haus aus kann.

  • Wenn du php artisan down ohne Parameter ausführst, wird der Wartungsmodus mit einer JSON-Datei (storage/framework/down) aktiviert, und Laravel behandelt Anfragen durch die Middleware PreventRequestsDuringMaintenance.
    Diese Middleware prüft dann:

    • ob der Request in der except-Liste steht
    • ob z. B. API- oder Debug-Zugriffe erlaubt sind
    • und rendert erst danach die 503-Seite

    Wenn du aber --render verwendest, passiert intern Folgendes: Laravel schreibt in die down-Datei einen Pfad zur View, z. B.:

    Code
    {
      "template": "errors::503" 
    } 

    Dadurch wird der Request nicht mehr vollständig durch die Middleware geführt, sondern direkt vom Kernel abgefangen.
    Das heißt: die Prüfung der except-Routen wird übersprungen, weil Laravel denkt, es soll sofort rendern.

    Das ist also kein Fehler in deinem Code – sondern tatsächlich eine Einschränkung im Laravel-Core.

  • Haha danke. Genau das konnte ich leider auch rausfinden. --render fängt direkt in der index.php im Public Ordner ab und liefert die 503 direkt statisch ohne das framework zu booten ergo keine middlewares laufen.

    Ich denke ich muss genau in der index das abfangen und dort die requests prüfen aber bin total lost .. :)

    Wie ich diese down.json manipulieren kann weiss ich allerdings möchte ich das der Befehl artisan down genau diese Datei dann anlegt. Notlösung wäre ein eigener Befehl ala

    Code
    php artisan maintenance:down / up

    der dann wiederum diese down anlegt. Soweit so gut .. das problem ist aber das command sagt .. wurde aktiviert .. down ist da .. aber app schaltet nicht auf 503

    Nachtrag: Habe es nun hin bekommen. Eigene Maintenance Mode inklusive Helper und Fastrender über index.php. Muss heute Mittag mal schauen wegen dem Template was da kommen sollte. Momentan nur message.

    Edited once, last by pixel (November 10, 2025 at 11:40 AM).

  • Eigentlich hast du dir das ganze selbst gelöst, die GPT generierten Antworten dazwischen die veraltet sind mal ausgelassen.

    Der Flag render umgeht das das ganze gebootet wird beim request, wodurch Ausnahmen natürlich nicht behandelt werden.

    Wenn du das booten beim request verhindern willst, dennoch aber den normalen Wartungsmodus verwenden willst, empfehle ich dir, nicht nur dafür, einen AppServer zu verwenden. Wie zum Beispiel Swoole, RoadRunner oder FrankenPHP.

    Welcher davon für dich in Frage kommt, ist deine Entscheidung. Persönlich nutze ich Swoole, da dort mit SwooleTables und SwooleCache zwei sehr praktische Dinge zusätzlich existieren.

    A red dragon falls from the heavens...
    Ah, that memory has been lost. A shame. It was a favorite of mine.

  • Die gesamte Anwendung muss nicht mit jedem request (ja auch Seitenwechsel!) neu gebootet und kompiliert werden.

    Das passiert dann einmal und wird dann stets aus dem kompilierten heraus an den Besucher gesendet.

    A red dragon falls from the heavens...
    Ah, that memory has been lost. A shame. It was a favorite of mine.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!