2016-05-17 1 views
1

すべてのモデルでAuthを使用して、検索時に日付時刻をユーザーのタイムゾーンに変換します。今、私はユーザーが認証されていない状況に遭遇し、この変換は私のモデルで行う必要があります。Laravel 5でグローバル関数を作成する正しい方法は何ですか

私の目標は、そうのような別のテーブルからデフォルトのタイムゾーンを取得するために、次のようになります。

 $business = Business::where('id', '=', $id)->first(); // default timezone is in here: $business->timezone 

私は、\認証を使用するので::ユーザー() - すべての私のモデルで>タイムゾーン、私の場所があります上記のコードを追加する必要があります(ユーザーが認証されていない場合は$ idを渡す必要があります)ので、ユーザーが認証されていない場合にのみ、グローバルに$ business-> timezoneにアクセスできます。

これは私のモデルの1つに現在あるコードです。

/** 
* Set event_start attribute. 
*/ 
public function setEventStartAttribute($event_start) 
{ 
    $this->attributes['event_start'] = Carbon::createFromFormat('Y-m-d H:i', $event_start, \Auth::user()->timezone)->setTimezone('UTC'); 
} 

/** 
* Set event_end attribute. 
*/ 
public function setEventEndAttribute($event_end) 
{ 
    $this->attributes['event_end'] = Carbon::createFromFormat('Y-m-d H:i', $event_end, \Auth::user()->timezone)->setTimezone('UTC'); 
} 

/** 
* Get event_end attribute. 
*/ 
public function getEventEndAttribute($value) 
{ 
    $format = $this->getDateFormat(); 
    return Carbon::createFromFormat($format, $value, 'UTC')->setTimezone(\Auth::user()->timezone); 
}  

/** 
* Get event_end attribute. 
*/ 
public function getEventEndAttribute($value) 
{ 
    $format = $this->getDateFormat(); 
    return Carbon::createFromFormat($format, $value, 'UTC')->setTimezone(\Auth::user()->timezone); 
} 

私は私のコードは、その後のようなものに変更されるだろうと思います。

この場合
/** 
* Set event_start attribute. 
*/ 
public function setEventStartAttribute($event_start) 
{ 
    if (Auth::check()) { 
     $this->attributes['event_start'] = Carbon::createFromFormat('Y-m-d H:i', $event_start, \Auth::user()->timezone)->setTimezone('UTC'); 
    } 
    else { 
     $this->attributes['event_start'] = Carbon::createFromFormat('Y-m-d H:i', $event_start, $business->timezone)->setTimezone('UTC'); 
    } 
} 

おかげ

答えて

0

、キャッシュは、デフォルトのタイムゾーンのためのオプションです。次に、この情報を静的に提供するクラスを作成します。

のようなクラスを作成します。

public class MyTimezone { 
    public static function getTimezone(){ 
     if(\Auth::check()) { 
      $timezone = \Auth::user()->timezone; 
     } else { 
      $timezone = Cache::get('default_timezone'); 
      if(empty($timezone)) { 
       //query business here 
       $timezone = $business->timezone; 
       Cache::put('default_timezone', $business->timezone); //cache here and "never" query again 
      } 
     } 
     return $timezone; 
    } 
} 

そして、このように使用:

$this->attributes['event_start'] = Carbon::createFromFormat('Y-m-d H:i', $event_start, MyTimezone::getTimezone())->setTimezone('UTC'); 
+0

ありがとうカスタムヘルパーではありませんか?申し訳ありません、ただ理解しようとしています。 – user3489502

+0

'MyTimezone'はヘルパーとして機能します。あなたは 'MyTimezoneHelper'を呼び出すことができます。ポイントは、DB上で複数のクエリを避けるために 'business-> timezone'情報をキャッシュすることです。気にしない場合は、キャッシュ部分を削除してください。 –

+0

だから、わかっていれば、ヘルパー関数が実行されます(データベースに常に照会します)が、キャッシュは1回実行されます(データベースへの1回の呼び出し)。そのクラスを作成するための最良の場所はどこですか? – user3489502

0

はカスタムヘルパーを作成し、どこでも、あなたのアプリケーション内からアクセスできるよう、この記事を見てみましょう:

Best practices for custom helpers on Laravel 5

+0

ありがとう、私はそこにいくつかの良い例を見てきました。私のカスタムヘルパーでのクエリは、特定のルート( '$ business = Business :: where( 'id'、 '='、$ id) - > first();)の' {id} )。顧客のヘルパーを特定のルートだけで実行する方法はありますか?ありがとう、 – user3489502

+0

私の答えを見つけました。ヘルパーを実行する前に、私が行っているルート( 'if(Route :: current() - > getName()== 'myNonAuthRoute')')を確認します。ありがとう – user3489502

関連する問題