时区中间件不起作用

时间:2017-04-24 13:45:24

标签: php laravel timezone middleware

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

<?php

namespace App\Http\Middleware;

use Closure;

class TimezoneMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $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字段时,无论我在数据库中设置用户时区,时间都保持不变。

3 个答案:

答案 0 :(得分:0)

你的问题似乎是你想要正常的过滤器/系统中间件而不是路由中间件,所以如果你把你的中间件放在kernel.php文件的底部,那将无法工作。

在kernel.php中有不同的中间件,你应该在$middleware section and if your middleware is for routes to protect the routes then add into routeMiddleware`中添加过滤器类型的中间件。

过滤类型的中间件,你的进入

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

如果路由保护和过滤器中间件进入此

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    //..................
    //.................

];

和时区

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

答案 1 :(得分:0)

您可以使用:

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

但是,我认为必须有更好的选择。

答案 2 :(得分:0)

我高度推荐将您的日期保留在UTC数据库中 - 它会让您在以后的日常生活中感到头痛。

我建议使用Eloquent Mutators,即可 适用于您的模型。

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

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

<?php

namespace App;

use Carbon\Carbon;

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

    }

}

然后在你的模型中,为了论证,我们假设你的日期字段被称为&#34; registered_at&#34;,你要添加以下方法:

<?php

namespace App;

use App\DateTimeZoneMutator;
use Illuminate\Database\Eloquent\Model;

class Something extends Model
{

    // ...

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

    // ...

}