Hướng dẫn laravel mysql timezone

Giả dụ bạn đang làm một dự án mà ứng dụng của họ được sử dụng ở nhiều quốc gia, vậy thì mỗi nơi khác nhau lại có một múi giờ riêng [VD như Việt Nam và Nhật Bản múi giờ chênh lệch nhau 2h] dẫn đến việc lưu timestamp trong DB sẽ bị conflict và sẽ có lúc hiển thị time sai.

Vậy cách giải quyết vấn đề này là gì? Thì trong bài viết hôm nay mình xin hướng dẫn các bạn set multiple timezone trong project laravel nha! cumming nạ

1. Giới thiệu

Như mọi người cũng biết Laravel cũng cấp cho chúng ta folder config - dùng để chứa các file cấu hình cho Laravel. Và mặc định khi bạn create 1 project Laravel timezone default sẽ được set mặc định trong file config/app.php và mình có thể thay đổi nó thành bất kỳ múi giờ nào bạn mong muốn ạ.

    /*
    |--------------------------------------------------------------------------
    | Application Timezone
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default timezone for your application, which
    | will be used by the PHP date and date-time functions. We have gone
    | ahead and set this to a sensible default for you out of the box.
    |
    */

    'timezone' => 'UTC',

Tuy nhiên lại quay lại bài toán ở trên, vậy nếu mình muốn sử dụng nhiều timezone khác nhau thì sao? làm cách nào? Thì bây giờ chúng mình cùng đọc tiếp phần 2 của mình nhé!

2. Các bước thực hiện

1. Create project

Bước đầu tiên mình sẽ tạo 1 project Laravel bằng cách run comman sau:

composer create-project laravel/laravel multi-timezone

Trong ví dụ demo này mình bỏ qua các bước setup và seed data, mình sử dụng luôn table có sẵn users. Sau khi create xong project mình tìm đến file config/app.php và tìm đến 'timezone' để set timezone mặc định chúng ta sẽ sử dụng nè. VD ở đây mình sẽ set timezone mặc định là Tokyo

'timezone' => env['TIMEZONE', 'Asia/Tokyo'],

Bước tiếp theo chúng ta sẽ create TimeZoneMiddleware và cấu hình cho nó nhé!

2. Create TimeZoneMiddleware

Run comman: php artisan make:middleware TimeZoneMiddleware

Sau khi câu lệnh chạy xong, mình sẽ đi đăng ký middleware trong app/Http/Kernel.php tại thuộc tính $routeMiddleware để gán middleware đó cho một route cụ thể.

    protected $routeMiddleware = [
        \\ other middlewares
        'timezone' => \App\Http\Middleware\TimeZoneMiddleware::class,
    ];

PHP cung cấp cho chúng ta hàm date_default_timezone_set[] và dùng để set giá trị timezone cho hệ thống, sau khi set thì tất cả các hàm xử lí thời gian sẽ sử dụng timezone này. Sau khi cấu hình cho TimeZoneMiddleware thì mình có một file app/Http/Middleware/TimeZoneMiddleware.php như sau:

Chủ Đề