Trang báo lỗi - Error Page

Khi trang không thấy hoặc một số lỗi phát sinh trong ứng dụng web, một trang thông báo lỗi sẽ xuất hiện. Ứng dụng Skeleton của ZF đã cấu hình để các trang lỗi này được điều khiển bởi template thông báo lỗi, có hai loại như nội dung trong module.config.php

<?php
return [
    //...

    'view_manager' => [
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',>
        ],
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],

  • display_not_found_reason nếu true sẽ hiện thị chi tiết nguyên nhân lỗi 404
  • display_exceptions có hiện thị thông tin khi có exception
  • not_found_template tên template cho lỗi 404 (ở trên là tên error/404, từ tên này xác định được vị trí template file: /view/error/404.phtml)
  • exception_template tên template cho exception (ở trên là tên error/index, từ tên này xác định được vị trí template file: /view/error/index.phtml)

Từ các thông tin này, bạn có thể cấu hình lại cách thức hiện thị lỗi, như thay đổi các template hiện thị lỗi, hoặc đơn giản là mở file view/error/404.php hoặc view/error/index.php để sửa file này thành nội dung mong muốn.

Bạn thử nhập địa chỉ: http://localhost/zf3/application/about1

Ví dụ trang 404

Nếu muốn xem trang lỗi khác, bạn có thể phát sinh một Exception để hiện thị lỗi bằng cách thêm mã lệnh như: throw new \Exception("Đây là một Exception");

Trang báo lỗi - Nâng cao

Phần nâng cao này bạn có thể đọc sau. Ở các trang báo lỗi mặc định trên, bạn thấy sau khi template về lỗi render, kết quả lại chuyển cho layout render, mà layout này trùng với layout hệ thống chung (bạn thấy phần header của trang có các menu, footer ... là các thành phần của layout). Giời bạn muốn các template lỗi sẽ sử dụng một layout chuyên về lỗi chẳng hạn.

Đổi layout với các trang báo lỗi

Bước 1

Tạo một template layout cho lỗi, ví dụ có tên layouterror.phtml với nội dung như:

module/Application/view/layout/layouterror.phtml

<?= $this->doctype() ?>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <?= $this->headTitle('Thông báo lỗi')->setSeparator(' - ')->setAutoEscape(false) ?>

        <?= $this->headMeta()
            ->appendName('viewport', 'width=device-width, initial-scale=1.0')
            ->appendHttpEquiv('X-UA-Compatible', 'IE=edge')
        ?>

        <!-- Le styles -->
        <?= $this->headLink(['rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/img/favicon.ico'])
            ->prependStylesheet('https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css')
        ?>

        <!-- Scripts -->
        <?= $this->headScript()
            ->prependFile('https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js')
            ->prependFile('https://code.jquery.com/jquery-3.2.1.slim.min.js')
        ?>
    </head>
    <body>
            <?= $this->content ?>
            <p class="alert alert-warning">Đây là trang thông báo lỗi</p>

    </body>
</html>

Bước 2

Đăng ký layout template này vào hệ thống, giả sử đặt tên là layouterror và cấu hình trong config tên này vào mục template_map như sau:

<?php
return [
    //...

    'view_manager' => [
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
            'layouterror'             => __DIR__ . '/../view/layout/layouterror.phtml',

        ],
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],

Bước 3 lăng nghe dispatch.error

Thi lỗi xảy ra, nó phát sinh sự kiện dispatch.error, ta sẽ lăng nghe sự kiện này để thiết lập layout khác.

Cập nhật Module.php ở phương thức onBootstrap như sau

module/Application/src/Module.php

//..
public function onBootstrap(\Zend\Mvc\MvcEvent $e)
{
    $eventmanager = $e->getApplication()->getEventManager();

    //Lắng nghe lỗi
    $eventmanager->attach('dispatch.error', function($e) {
    $e->getViewModel()->setTemplate('layouterror');
    });

}
//..

Từ giờ các trang báo lỗi đã dùng layout mới để hiện thị lỗi.

Tích hợp whoops

Cơ bản vê whoops bạn đọc ở đây: Error handler - Whoops

Nó là một thư viện về error_handler, nó đưa ra nhiều thông tin chi tiết về lỗi và hiện thị trực quan.

Bạn có tích hợp whoops bằng composer như sau:

composer require ppito/zf3-whoops

Sau khi tích hợp vào, mở file config/modules.config.php thêm tên module 'WhoopsErrorHandler' lên đầu