Laravel 4 - 为用户设置时区

时间:2014-08-06 03:22:03

标签: php datetime laravel laravel-4

在laravel中,默认时区在app/config/app.php中设置为UTC。在我的用户设置页面上,用户可以选择他们的首选时区,这就是存储数据库。

目前我在我的routes.php中将此时区从默认UTC更改为用户时区。

$timezone = (Auth::user()->userDetail->timezone) ? Auth::user()->userDetail->timezone : Config::get('app.timezone');
date_default_timezone_set($timezone);

这是放置它的最佳位置吗?我只使用routes.php进行路线分组,获取和发布。

2 个答案:

答案 0 :(得分:1)

在文件app / filters.php中,

这样做:

    App::before(function($request)
    {
        $timezone = (Auth::user()->userDetail->timezone) ? 
            Auth::user()->userDetail->timezone : 
            Config::get('app.timezone');
        date_default_timezone_set($timezone);

        DB::statement("SET time_zone = '" . $timezone . "'");
    });

作为奖励,我们设置MySQL连接的时区。

答案 1 :(得分:0)

我只是在学习laravel,但是当我使用其他框架时,我更喜欢把东西放在服务层中。因此,例如,如果您有一条指向用户设置时区的页面的路径,那么它将连接到控制器。让我们说控制器被称为SettingsController,看起来像这样(释义):

class SettingsController {

     public function saveSettings() {
         $settingsService = new SettingsService();
         $settingsService->save( $params ); 
     }    

 }

然后您在另一个类中拥有设置服务:

class SettingsService {

 public function save( $params ) {
      // Assuming the settings page could save to multiple places (not all in same table)...
      $timezone->set( $params['timezone'] );  // set and save timzeone params
      .... // save other params
 }
}

否则,如果时区和其他内容都在同一个表中,则将其保存在一起。如果您只是想在不保存的情况下显示时区,则同样适用的概念如下:

class SettingsController {

public function setSettings() {
     $settingsService = new SettingsService(); // or timeservice or whatever you want to call it
     $settingsService->setSettings( $userInfo ); 
}    

}

然后您在另一个类中拥有设置服务:

class SettingsService {

 public function setSettings( $userInfo ) {
      // Assuming the settings page could save to multiple places (not all in same table)...
      $user->setTimezone( $userInfo['timezone'] );  // set and save timzeone params
      .... // save other params
 }
}

你可能更疯狂,让它访问成员时区而不是直接访问阵列,但这对于这个简单的项目来说太过分了。是的,新类是硬编码依赖,可以注入。我的观点是,有许多方法可以使这种方式比它需要的更复杂。

如果不清楚,请道歉。不要在我面前拉扯,但一般的想法是将它分层,尽管这对你正在做的事情来说可能是太多的开销。我知道Zend有帮助者的概念,虽然我不熟悉laravel知道是否存在(虽然我会认为它会存在)。

希望这会有所帮助。