时区中间件不工作

2022-04-16 00:00:00 middleware timezone php laravel

我创建了一个中间件,以便根据数据库中设置的身份验证用户时区设置时区:

<?php

namespace AppHttpMiddleware;

use Closure;

class TimezoneMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->user()->guest()) {
            $timezone = config('app.timezone');
        }
        else {
            $timezone = $request->user()->timezone;
        }

        date_default_timezone_set($timezone);

        return $next($request);
    }
}

我在Kernel.php中将此类添加到全局HTTP中间件声明的底部。

问题是它不起作用。显示created_at字段时,无论我在数据库中设置什么用户时区,时间都保持不变。


解决方案

我强烈建议将您的日期保留在世界协调时的数据库中-这将为您以后的工作省去麻烦。

我建议使用Eloquent Mutators,它可以 应用于您的模型。

这将使您仍然可以使用数据表,因为突变就在从数据库中提取数据之后发生。

您或许可以在您的应用程序中创建一个可重用的类,其中包含用于解析日期的静态方法,例如:

<?php

namespace App;

use CarbonCarbon;

class DateTimeZoneMutator
{

    public static function mutate($value)
    {

        if (auth()->user()->guest()) {
            $timezone = config('app.timezone');
        }
        else {
            $timezone = auth()->user()->timezone;
        }

        return new Carbon(
            $value, $timezone
        );

    }

}

然后在您的模型中,为了便于讨论,我们假设您的日期字段名为"REGISTERED_AT",您将添加以下方法:

<?php

namespace App;

use AppDateTimeZoneMutator;
use IlluminateDatabaseEloquentModel;

class Something extends Model
{

    // ...

    public function getRegisteredAtAttribute($value)
    {
        return DateTimeZoneMutator::mutate($value);
    }

    // ...

}

相关文章