在Laravel 5中创建全局函数的正确方法是什么

时间:2016-05-17 16:32:37

标签: laravel laravel-5

我在所有模型中使用Auth在检索时将日期时间转换为用户的时区。现在我遇到了用户未经过身份验证的情况,这种转换需要在我的模型中完成。

我的目标是从另一个表中检索默认时区,如下所示:

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

由于我在我的所有模型中都使用\ Auth :: user() - > timezone,我是否应该在上面添加代码(我需要传递$ id,这在用户时是不可用的是否经过身份验证)以检索默认时区,因此我可以全局访问$ business-> timezone,仅在用户未经过身份验证时?

这是我目前在其中一个模型中的代码。

/**
 * 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');
    }
}   

由于

2 个答案:

答案 0 :(得分:0)

在这种情况下,Cache是​​默认时区的选项。然后创建一个静态提供此信息的类。

创建一个类:

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

答案 1 :(得分:0)

创建一个自定义帮助程序并使其可以从应用程序的任何位置访问,看看这篇文章:

Best practices for custom helpers on Laravel 5