Laravel在控制器中使用公共静态函数是不好的


Laravel is it bad to use public static functions in controllers

Laravel控制器中使用公共静态函数不好吗

在我的产品模型中,我有一个看起来像这样的函数:

public static function setEndDate($time)
{
   if ($time == 2)                                                 
   {
         return Carbon::now()->addMonths(2)->toDateTimeString();
   }
   else                                                            
   {
         return Carbon::now()->addDays($time)->toDateTimeString();
   }
}

然后在我的控制器中,我像这样使用该功能:

//Validation etc..
$time = Input::get('end_date'); //To transform end-time
$newProduct = new Product();
$newProduct->some_value = Input::get('some_value');
$newProduct->some_value = Input::get('some_value');

$newProduct->end_date = Product::setEndDate($time); //Using my static function like this

newProduct->save();

使用上述静态函数不好吗?

这个问题本身是非常基于意见的。我不会说在你的模型中使用这些方法一定是不好的,尽管我也不建议这样做。(有关此的更多信息,请查看@Colin Schoen的答案)

无论如何,Eloquent 为您的这个特定问题提供了一个更好的解决方案:突变者!

它们是一种"资源库方法",您可以在其中修改或更改将分配给属性的值。下面是一个示例:

public function setEndDateAttribute($time){
    if ($time == 2)                                                 
    {
        $this->attributes['end_date'] = Carbon::now()->addMonths(2)->toDateTimeString();
    }
    else                                                            
    {
        $this->attributes['end_date'] = Carbon::now()->addDays($time)->toDateTimeString();
    }
}

你像这样使用它:

$newProduct->end_date = $time;

创建静态方法时,没有任何内容会固有地中断,但与所有文档一样,不建议这样做。为什么?

静态状态是无所不在的,并且完全破坏了可测试性,因为您不能只是重置状态。此外,任何事情都可能以代码的其他方面无法预测的方式影响状态,从而导致非常不可预测的行为。

Laravel 4通过使用静态的"外墙"来防止这种情况。这些立面是"IoC 解析的语法简写"。它们既提供语法糖,又防止紧密耦合的代码。

可以更改由外观解析的类,并允许您注入模拟系统或任何您想要的东西。