Inhaltsverzeichnis
基本配置
自定义异常类
Grundkonfiguration
Benutzerdefinierte Ausnahmeklasse
总结
Heim PHP-Framework Laravel Ein Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden

Ein Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden

Oct 02, 2022 am 06:00 AM
php laravel

Ein Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden

In diesem Artikel werden wir eine der wichtigsten und am wenigsten diskutierten Funktionen des Laravel-Webframeworks untersuchen – Ausnahmebehandlung. Laravel verfügt über einen integrierten Ausnahmehandler, mit dem Sie Ausnahmen einfach melden und auf benutzerfreundliche Weise präsentieren können. 异常处理。 Laravel 带有一个内置的异常处理程序,可以让您轻松地以友好的方式报告和呈现异常。

在文章的前半部分,我们将探讨异常处理程序提供的默认设置。 事实上,我们首先会通过默认的 Handler 类来理解 Laravel 是如何处理异常的。

在文章的后半部分,我们将继续介绍如何创建自定义异常处理程序,以便您可以捕获自定义异常。

基本配置

在开始研究异常处理类之前,让我们先来看看几个和异常相关且很重要的参数配置。

打开 config/app.php 文件,并仔细的看看下面的代码片段。

...
...
/*
|--------------------------------------------------------------------------
| 应用的调试模式
|--------------------------------------------------------------------------
|
| 当引用处于调试模式,将会显示错误产生式的详细堆栈信息
| 如果禁用,则只显示一个简单的错误页面
|
*/

'debug' => env('APP_DEBUG', false),
...
...
Nach dem Login kopieren

从参数的名称可以猜到,如果设置为 TRUE,将有利于我们调试应用产生的错误。默认值由 .env 环境变量配置文件中的  APP_DEBUG 参数指定。

在开发环境下,建议你将它设置为 TRUE ,这样,通过清晰的错误堆栈信息,能很快的定位错误产生的原因并修复。 另外,当处于正式环境是,我们需要通过环境变量的配置项来关闭它,当错误产生式将只显示通用的提示页面。

除了将错误显示在页面上,Laravel 也允许你将错误记录到日志文件中。现在,让我们来看看日志相关的配置,打开 config/app.php 文件,并仔细的看看下面的代码片段。

...
...
'log' => env('APP_LOG', 'single'),

'log_level' => env('APP_LOG_LEVEL', 'debug'),
...
...
Nach dem Login kopieren

Laravel 框架中,是使用 Monolog 库来记录日志的。你可以通过上面的配置项来配置 Monolog 库。

默认的日志文件保存路径为 storage/logs/laravel.log,通常情况下,你无需更改它。与此同时,你可以通过  APP_LOG_LEVEL 来指定需要被记录到日志文件的错误级别。

前面介绍了异常和日志的基本配置。

接下来,我们看看 Laravel 应用默认的异常处理类。打开 app/Exceptions/Handler.php 文件.

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * 定义无需报告的异常类型
     *
     * @var array
     */
    protected $dontReport = [
        \Illuminate\Auth\AuthenticationException::class,
        \Illuminate\Auth\Access\AuthorizationException::class,
        \Symfony\Component\HttpKernel\Exception\HttpException::class,
        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
        \Illuminate\Session\TokenMismatchException::class,
        \Illuminate\Validation\ValidationException::class,
    ];

    /**
     * 报告或者通过日志记录一个异常
     *
     * 可以在这个方法中将异常报告给 Sentry, Bugsnag 等平台
     *
     * @param  \Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * 将异常通过 Http 返回
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }

    /**
     * 将认证相关的异常转换为未认证的响应(401)
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Illuminate\Auth\AuthenticationException  $exception
     * @return \Illuminate\Http\Response
     */
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }

        return redirect()->guest(route('login'));
    }
}
Nach dem Login kopieren

上面的处理类主要包含2个功能:报告和显示所有的异常信息。

让我们仔细看一眼 report 方法。

/**
 * 报告或记录一个异常。
 *
 * 这是一个将异常发送给 Sentry 和 Bugsnag 等机构的好时机。
 *
 * @param  \Exception  $exception
 * @return void
 */
public function report(Exception $exception)
{
    parent::report($exception);
}
Nach dem Login kopieren

report 方法用于将错误记录到日志文件中。同时,关注一项重要的 dontReport 属性,它列出了所有不应该被记录到日志的异常类别。

接下来,我们介绍 render 方法。

/**
 * 将异常渲染至 HTTP 响应值中。
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    return parent::render($request, $exception);
}
Nach dem Login kopieren

如果说 report 方法是用于记录或报告错误,那么 render 方法是用于将错误渲染显示在屏幕上。事实上,当异常发生时,这个方法决定了哪些内容将被展示给用户。

render 方法也允许你针对不同类别的错误自定义响应值,这部分内容我们将在下一章学习。

最后, unauthenticated 方法处理了 AuthenticationException 异常,你能够在此决定当用户访问了一个未授权页面时所展示的内容。

自定义异常类

在这一节,我们将创建一个自定义异常类,用于处理 CustomException 类别的异常。创建自定义异常类背后的想法是更轻松地管理自定义异常同时显示自定义响应。

开始着手创建一个文件 app/Exceptions/CustomException.php ,内容如下所示。

<?php

namespace App\Exceptions;

use Exception;

class CustomException extends Exception
{
    /**
     * 报告这个异常。
     *
     * @return void
     */
    public function report()
    {
    }

    /**
     * 将异常渲染至 HTTP 响应值中。
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render($request)
    {
        return response()->view(
                'errors.custom',
                array(
                    'exception' => $this
                )
        );
    }
}
Nach dem Login kopieren

重要的是需要注意 CustomException 类必须继承核心 Exception 类。为了演示用途,我们仅仅讨论了 render 方法,但显然你也能够自定义修改 report 方法。

正如你看到的,在样例中我们将用户重定向至 errors.custom 错误页面。通过这种方式,你能够为特定类型的异常实现自定义的错误页面。

当然,我们需要创建一个关联的视图文件 resources/views/errors/custom.blade.php

Exception details: <b>{{ $exception->getMessage() }}</b>
Nach dem Login kopieren

这是一个相当简单的视图文件,只显示一行错误消息,不过你也可以按照自己希望的方式设计这个视图。

我们也需要在 app/Exceptions/Handler.php 文件的 render 方法中进行一些修改,保证我们的自定义异常类能够被调用。让我们将 app/Exceptions/Handler.php 文件中的 render 方法替换为以下内容。

...
...
/**
 * 将异常渲染至 HTTP 响应值中。
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    if ($exception instanceof \App\Exceptions\CustomException)  {
        return $exception->render($request);
    }

    return parent::render($request, $exception);
}
...
...
Nach dem Login kopieren

正如你所看到的,我们会在 render 方法中首先检查异常的类型。如果异常的类别是 AppExceptionsCustomException ,我们将调用这个类的 render 方法。

一切准备就绪。现在我们创建一个控制  app/Http/Controllers/ExceptionController.php

In der ersten Hälfte des Artikels werden wir die Standardeinstellungen untersuchen, die von Ausnahmehandlern bereitgestellt werden. Tatsächlich werden wir zunächst verstehen, wie Laravel Ausnahmen über die Standard-Handler-Klasse behandelt. 🎜🎜In der zweiten Hälfte des Artikels stellen wir Ihnen weiterhin vor, wie Sie einen benutzerdefinierten Ausnahmehandler erstellen, damit Sie benutzerdefinierte Ausnahmen abfangen können. 🎜

Grundkonfiguration

🎜Bevor wir mit dem Studium der Ausnahmebehandlungsklasse beginnen, werfen wir zunächst einen Blick auf einige wichtige Parameterkonfigurationen im Zusammenhang mit Ausnahmen. 🎜🎜Öffnen Sie die Datei config/app.php und schauen Sie sich den folgenden Codeausschnitt genauer an. 🎜
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ExceptionController extends Controller
{
    public function index()
    {
        // 出错了,你可以抛出自定义的异常 CustomException
        throw new \App\Exceptions\CustomException('Something Went Wrong.');
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Wie Sie anhand des Namens des Parameters erraten können, hilft er uns, von der Anwendung generierte Fehler zu debuggen, wenn er auf TRUE gesetzt ist. Der Standardwert wird durch den Parameter APP_DEBUG in der Konfigurationsdatei der Umgebungsvariablen .env angegeben. 🎜🎜In der Entwicklungsumgebung wird empfohlen, den Wert auf TRUE zu setzen. Auf diese Weise können Sie durch klare Fehlerstapelinformationen die Fehlerursache schnell lokalisieren und beheben. Darüber hinaus müssen wir es in der formalen Umgebung über das Konfigurationselement der Umgebungsvariablen deaktivieren. Wenn ein Fehler auftritt, wird nur eine allgemeine Eingabeaufforderungsseite angezeigt. 🎜🎜Neben der Anzeige von Fehlern auf der Seite ermöglicht Ihnen Laravel auch, Fehler in einer Protokolldatei zu protokollieren. Schauen wir uns nun die protokollierungsbezogene Konfiguration an. Öffnen Sie die Datei config/app und schauen Sie sich den folgenden Codeausschnitt genauer an. 🎜
// Exception routes
Route::get('exception/index', 'ExceptionController@index');
Nach dem Login kopieren
Nach dem Login kopieren
🎜Im Laravel-Framework wird die Monolog-Bibliothek zum Aufzeichnen von Protokollen verwendet. Sie können die Monolog-Bibliothek über die oben genannten Konfigurationselemente konfigurieren. 🎜🎜Der Standardspeicherpfad für Protokolldateien ist storage/logs/laravel.log. Normalerweise müssen Sie ihn nicht ändern. Gleichzeitig können Sie APP_LOG_LEVEL übergeben, um die Fehlerstufe anzugeben, die in der Protokolldatei aufgezeichnet werden muss. 🎜🎜Die Grundkonfiguration von Ausnahmen und Protokollen wurde bereits früher eingeführt. 🎜🎜Als nächstes werfen wir einen Blick auf die Standard-Ausnahmebehandlungsklasse der Laravel-Anwendung. Öffnen Sie die Datei app/Exceptions/Handler.php 🎜rrreee🎜Die obige Verarbeitungsklasse enthält hauptsächlich zwei Funktionen: Melden und Anzeigen aller Ausnahmeinformationen. 🎜🎜Schauen wir uns die Methode report genauer an. Die 🎜rrreee🎜report-Methode wird verwendet, um Fehler in einer Protokolldatei zu protokollieren. Achten Sie außerdem auf ein wichtiges dontReport-Attribut, das alle Ausnahmekategorien auflistet, die nicht protokolliert werden sollen. 🎜🎜Als nächstes stellen wir die Methode render vor. 🎜rrreee🎜Wenn die Methode report zum Aufzeichnen oder Melden von Fehlern verwendet wird, wird die Methode render zum Rendern und Anzeigen von Fehlern auf dem Bildschirm verwendet. Tatsächlich bestimmt diese Methode, welcher Inhalt dem Benutzer angezeigt wird, wenn eine Ausnahme auftritt. Mit der Methode 🎜🎜render können Sie auch Antwortwerte für verschiedene Fehlertypen anpassen, was wir im nächsten Kapitel erfahren werden. 🎜🎜Schließlich behandelt die Methode unauthenticated die Ausnahme AuthenticationException, bei der Sie entscheiden können, welche Inhalte angezeigt werden sollen, wenn der Benutzer auf eine nicht autorisierte Seite zugreift. 🎜

Benutzerdefinierte Ausnahmeklasse

🎜In diesem Abschnitt erstellen wir eine benutzerdefinierte Ausnahmeklasse, um Ausnahmen der Kategorie CustomException zu behandeln. Die Idee hinter der Erstellung einer benutzerdefinierten Ausnahmeklasse besteht darin, benutzerdefinierte Ausnahmen einfacher zu verwalten und gleichzeitig benutzerdefinierte Antworten anzuzeigen. 🎜🎜Beginnen Sie mit der Erstellung einer Datei app/Exceptions/CustomException.php mit dem folgenden Inhalt. 🎜rrreee🎜Es ist wichtig zu beachten, dass die Klasse CustomException die Kernklasse Exception erben muss. Zu Demonstrationszwecken haben wir nur die Rendermethode besprochen, aber natürlich können Sie auch die Berichtsmethode anpassen. 🎜🎜Wie Sie sehen können, leiten wir den Benutzer im Beispiel auf die Fehlerseite errors.custom um. Auf diese Weise können Sie benutzerdefinierte Fehlerseiten für bestimmte Ausnahmetypen implementieren. 🎜🎜Natürlich müssen wir eine zugehörige Ansichtsdatei resources/views/errors/custom.blade.php erstellen. 🎜rrreee🎜Dies ist eine ziemlich einfache Ansichtsdatei, die nur eine einzeilige Fehlermeldung anzeigt, aber Sie können die Ansicht nach Ihren Wünschen gestalten. 🎜🎜Wir müssen außerdem einige Änderungen an der Render-Methode der Datei app/Exceptions/Handler.php vornehmen, um sicherzustellen, dass unsere benutzerdefinierte Ausnahmeklasse aufgerufen werden kann. Ersetzen wir die Render-Methode in der Datei app/Exceptions/Handler.php durch Folgendes. 🎜rrreee🎜Wie Sie sehen, prüfen wir zunächst die Art der Ausnahme in der Render-Methode. Wenn die Klasse der Ausnahme AppExceptionsCustomException ist, rufen wir die Rendermethode dieser Klasse auf. 🎜🎜Alles ist bereit. Jetzt erstellen wir ein Steuerelement app/Http/Controllers/ExceptionController.php, um die benutzerdefinierte Ausnahmeklasse zu testen. 🎜
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class ExceptionController extends Controller
{
    public function index()
    {
        // 出错了,你可以抛出自定义的异常 CustomException
        throw new \App\Exceptions\CustomException('Something Went Wrong.');
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

当然,你需要先在 routes/web.php 文件中添加相关的路由,就像下面一样。

// Exception routes
Route::get('exception/index', 'ExceptionController@index');
Nach dem Login kopieren
Nach dem Login kopieren

之后,你可以浏览 http://your-laravel-site.com/exception/ind... 地址来查看是否和预期的一样。一切正常的话,页面将显示我们前面配置 errors.custom 视图。

就这样,你就可以按自己方式来处理 Laravel 中的异常。
完!尽情享受 Laravel 带来的编码的乐趣吧!

总结

今天,我们认真学习了 Laravel 中的异常处理特性。在文章的开头,我们搜索了 Laravel 提供的一些基础配置,用于显示和报告异常。紧接着,我们简要介绍了默认的异常处理类。

在文章的后半部分,我们通过创建一个自定义异常处理类,演示如何在应用中处理自定义的异常。

对于那些刚刚起步学习 Laravel ,或者期待拓展阅读相关知识、网站、应用扩展的读者,这里有一系列您能够学习的内容,参见 Envato Market 。

期待听到任何形式的咨询或建议!

原文地址:https://code.tutsplus.com/tutorials/exception-handling-in-laravel--cms-30210

译文地址:https://learnku.com/laravel/t/8783/exception-handling-in-laravel

【相关推荐:laravel视频教程

Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie Ausnahmen in Laravel behandelt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP und Python: Vergleich von zwei beliebten Programmiersprachen PHP und Python: Vergleich von zwei beliebten Programmiersprachen Apr 14, 2025 am 12:13 AM

PHP und Python haben jeweils ihre eigenen Vorteile und wählen nach den Projektanforderungen. 1.PHP ist für die Webentwicklung geeignet, insbesondere für die schnelle Entwicklung und Wartung von Websites. 2. Python eignet sich für Datenwissenschaft, maschinelles Lernen und künstliche Intelligenz mit prägnanter Syntax und für Anfänger.

PHP: Eine Schlüsselsprache für die Webentwicklung PHP: Eine Schlüsselsprache für die Webentwicklung Apr 13, 2025 am 12:08 AM

PHP ist eine Skriptsprache, die auf der Serverseite weit verbreitet ist und insbesondere für die Webentwicklung geeignet ist. 1.PHP kann HTML einbetten, HTTP -Anforderungen und Antworten verarbeiten und eine Vielzahl von Datenbanken unterstützt. 2.PHP wird verwendet, um dynamische Webinhalte, Prozessformdaten, Zugriffsdatenbanken usw. mit starker Community -Unterstützung und Open -Source -Ressourcen zu generieren. 3. PHP ist eine interpretierte Sprache, und der Ausführungsprozess umfasst lexikalische Analyse, grammatikalische Analyse, Zusammenstellung und Ausführung. 4.PHP kann mit MySQL für erweiterte Anwendungen wie Benutzerregistrierungssysteme kombiniert werden. 5. Beim Debuggen von PHP können Sie Funktionen wie error_reporting () und var_dump () verwenden. 6. Optimieren Sie den PHP-Code, um Caching-Mechanismen zu verwenden, Datenbankabfragen zu optimieren und integrierte Funktionen zu verwenden. 7

Der aktuelle Status von PHP: Ein Blick auf Webentwicklungstrends Der aktuelle Status von PHP: Ein Blick auf Webentwicklungstrends Apr 13, 2025 am 12:20 AM

PHP bleibt in der modernen Webentwicklung wichtig, insbesondere in Content-Management- und E-Commerce-Plattformen. 1) PHP hat ein reichhaltiges Ökosystem und eine starke Rahmenunterstützung wie Laravel und Symfony. 2) Die Leistungsoptimierung kann durch OPCACHE und NGINX erreicht werden. 3) Php8.0 führt den JIT -Compiler ein, um die Leistung zu verbessern. 4) Cloud-native Anwendungen werden über Docker und Kubernetes bereitgestellt, um die Flexibilität und Skalierbarkeit zu verbessern.

Php gegen andere Sprachen: Ein Vergleich Php gegen andere Sprachen: Ein Vergleich Apr 13, 2025 am 12:19 AM

PHP eignet sich für die Webentwicklung, insbesondere für die schnelle Entwicklung und Verarbeitung dynamischer Inhalte, ist jedoch nicht gut in Anwendungen auf Datenwissenschaft und Unternehmensebene. Im Vergleich zu Python hat PHP mehr Vorteile in der Webentwicklung, ist aber nicht so gut wie Python im Bereich der Datenwissenschaft. Im Vergleich zu Java wird PHP in Anwendungen auf Unternehmensebene schlechter, ist jedoch flexibler in der Webentwicklung. Im Vergleich zu JavaScript ist PHP in der Back-End-Entwicklung präziser, ist jedoch in der Front-End-Entwicklung nicht so gut wie JavaScript.

Die dauerhafte Relevanz von PHP: Ist es noch am Leben? Die dauerhafte Relevanz von PHP: Ist es noch am Leben? Apr 14, 2025 am 12:12 AM

PHP ist immer noch dynamisch und nimmt immer noch eine wichtige Position im Bereich der modernen Programmierung ein. 1) Einfachheit und leistungsstarke Unterstützung von PHP machen es in der Webentwicklung weit verbreitet. 2) Seine Flexibilität und Stabilität machen es ausstehend bei der Behandlung von Webformularen, Datenbankoperationen und Dateiverarbeitung; 3) PHP entwickelt sich ständig weiter und optimiert, geeignet für Anfänger und erfahrene Entwickler.

PHP: Die Grundlage vieler Websites PHP: Die Grundlage vieler Websites Apr 13, 2025 am 12:07 AM

Die Gründe, warum PHP für viele Websites der bevorzugte Technologie -Stack ist, umfassen die Benutzerfreundlichkeit, die starke Unterstützung der Community und die weit verbreitete Verwendung. 1) Einfach zu erlernen und zu bedienen, geeignet für Anfänger. 2) eine riesige Entwicklergemeinschaft und eine reichhaltige Ressourcen haben. 3) in WordPress, Drupal und anderen Plattformen häufig verwendet. 4) Integrieren Sie eng in Webserver, um die Entwicklung der Entwicklung zu vereinfachen.

PHP vs. Python: Kernmerkmale und Funktionen PHP vs. Python: Kernmerkmale und Funktionen Apr 13, 2025 am 12:16 AM

PHP und Python haben jeweils ihre eigenen Vorteile und eignen sich für verschiedene Szenarien. 1.PHP ist für die Webentwicklung geeignet und bietet integrierte Webserver und reichhaltige Funktionsbibliotheken. 2. Python eignet sich für Datenwissenschaft und maschinelles Lernen mit prägnanter Syntax und einer leistungsstarken Standardbibliothek. Bei der Auswahl sollte anhand der Projektanforderungen festgelegt werden.

Zweck von PHP: Erstellen dynamischer Websites Zweck von PHP: Erstellen dynamischer Websites Apr 15, 2025 am 12:18 AM

PHP wird verwendet, um dynamische Websites zu erstellen. Zu den Kernfunktionen gehören: 1. Dynamische Inhalte generieren und Webseiten in Echtzeit generieren, indem Sie eine Verbindung mit der Datenbank herstellen; 2. Verarbeiten Sie Benutzerinteraktions- und Formulareinreichungen, überprüfen Sie Eingaben und reagieren Sie auf Operationen. 3. Verwalten Sie Sitzungen und Benutzerauthentifizierung, um eine personalisierte Erfahrung zu bieten. 4. Optimieren Sie die Leistung und befolgen Sie die Best Practices, um die Effizienz und Sicherheit der Website zu verbessern.

See all articles