在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
进行路线分组,获取和发布。
答案 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知道是否存在(虽然我会认为它会存在)。
希望这会有所帮助。