2017-04-24 3 views
0

動作しません:私は、グローバルHTTPミドルウェア宣言の下にこのクラスを追加 タイムゾーンミドルウェアは、私がデータベースに設定された認証ユーザーのタイムゾーンに基づいてタイムゾーンを設定するためにミドルウェアを作成し

<?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

問題は機能しないということです。 created_atフィールドを表示すると、データベースのユーザータイムゾーンを設定しても、時間はまったく同じにとどまります。

+0

データベースのすべての日付と時刻はUTCで保存されます。データベースクエリから返される何らかの変換を行わない限り、 – RiggsFolly

+0

私は、データベースからフェッチされた 'timestamp'がユーザ指定のタイムゾーンを使いたいだけです。私はミドルウェア、サービスプロバイダ、何も動作していない。道に迷いました。私はdatatablesを使用しているので、これを自動的に実行します。 – kjdion84

+0

おそらくこれを読む必要がありますhttp://stackoverflow.com/questions/15017799/how-to-convert-utc-date-to-local-time-zone-in-mysql-select-query – RiggsFolly

答えて

0

データベース内の日付をUTCで残しておくことを強くお勧めします。後で、頭痛を軽減します。

私が示唆しているのはです。使用できる機種は です。

これにより、データがデータベースから取得された直後に突然変異が発生するため、データテーブルを引き続き使用できます。

あなたはおそらく、例えば、日付を解析するための静的メソッドを上あり、アプリケーション内の再使用可能なクラス作成することができます。そして、あなたのモデルの中から、引数のためにあなたを推定することができます

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

    } 

} 

を日付フィールドを「registered_at」と呼びます。

<?php 

namespace App; 

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

class Something extends Model 
{ 

    // ... 

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

    // ... 

} 
0

通常のフィルタ/システムミドルウェアを使用しないようにしてください。routeミドルウェアです。ミドルウェアのミドルウェアをkernel.phpファイルの下に置くと動作しません。

kernel.phpにはさまざまなミドルウェアがありますので、$middleware section and if your middleware is for routes to protect the routes then add into routeミドルウェアにフィルタータイプミドルウェアを追加する必要があります。あなたはこの

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

とIFルートの保護に入るとミドルウェアをフィルタリングするよう

フィルタタイプミドルウェアは、この

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

]; 

とタイムゾーンの

になり
Config::set('app.timezone','custom time zone'); 
+0

私はすでに正確にそれをしたという質問に言及しました。 – kjdion84

+0

私はすでにOPで言ったように、クラスをグローバルなHTTP '$ middleware'宣言に入れました。 – kjdion84

+1

'config :: set( 'app.timezone'、 'カスタムタイムゾーン');' date_default_timezone_set($ timezone);の代わりにタイムゾーンを設定しようとしましたか? – webDev

0

あなたかもしれません次のように使用してください:

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

しかし、もっと良い選択肢があるはずです。

関連する問題