时区中间件不起作用



我创建了一个中间件,以便基于数据库中的auth用户时区设置时区:

<?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字段时,无论我在数据库中设置用户时区域设置什么。

我将高度推荐将您的日期留在UTC的数据库中 - 稍后它将在直线上节省您的头痛。

我建议的是使用雄辩的突变器,这可以是应用于您的模型。

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

您可以在应用程序中创建一个可重复使用的类,该类具有用于解析日期的静态方法,例如:

<?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
        );
    }
}

然后从您的模型中,为了参数,让我们假设您的日期字段称为"注册_at",您将添加以下方法:

<?php
namespace App;
use AppDateTimeZoneMutator;
use IlluminateDatabaseEloquentModel;
class Something extends Model
{
    // ...
    public function getRegisteredAtAttribute($value)
    {
        return DateTimeZoneMutator::mutate($value);
    }
    // ...
}

您可以使用:

{{ $model->created_at->setTimezone( $timezone )->toDateTimeString() }}

但是,我相信必须有一个更好的选择。

您的问题似乎是您想要普通的过滤器/系统中间件而不是路由 Middlewares,因此,如果将kernel.php文件的中间件放置在将无法工作的kernel.php底部。

kernel.php中有不同的中间Wares,您应该在$middleware section and if your middleware is for routes to protect the routes then add into RouteMiddleWare.

中添加过滤器类型中间版。

滤波器类型中间件,因为您进入此

protected $middleware = [
    //.............
];

,如果路由保护和过滤器中间档案进入此

protected $routeMiddleware = [
    'auth' => IlluminateAuthMiddlewareAuthenticate::class,
    //..................
    //.................
];

和时区

Config::set('app.timezone','custom time zone');

相关内容

  • 没有找到相关文章

最新更新