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

时间:2015-01-10 17:47:35

标签: php laravel static-methods

在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();

使用上面的静态函数是不是很糟糕?

2 个答案:

答案 0 :(得分:2)

这个问题本身就是基于意见的。我不会说在你的模型中使用这些方法一定不好,尽管我也不建议这样做。 (有关该结账的详细信息,请@Colin Schoen's answer

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

它们是一种“setter方法”,您可以在其中修改或改变将分配给该属性的值。这是一个例子:

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;

答案 1 :(得分:0)

创建静态方法时,没有任何内在因素会破坏,但在所有文档中都不建议这样做。为什么?

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

Laravel 4通过使用静态外墙来防止这种情况发生。这些外观是IoC解决方案的语法简写"。它们提供语法糖并防止紧密耦合的代码。

可以更改外墙解决的类,并允许您注入模拟系统或任何您想要的内容。