【问题标题】:Laravel is it bad to use public static functions in controllers [closed]Laravel 在控制器中使用公共静态函数是不是很糟糕[关闭]
【发布时间】:2015-01-10 17:47:35
【问题描述】:

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

像上面这样使用静态函数不好吗?

【问题讨论】:

  • 一般来说使用静态调用是不好的(最好的做法不应该因为你使用最新的框架而改变)。它们导致与特定类名的紧密耦合,通常隐藏全局状态(以静态变量的形式)并且是单元测试的噩梦。 但是你可能会在 99.99% 的 Laravel 相关材料中看到它。做出自己的结论......
  • @tereško Laravel 的核心几乎都不是静态方法。 Laravel Facades 让它看起来像很多静态的,但在后台它实际上是一个服务定位器模式。
  • @lukasgeiter ,laravel 的外观 服务定位器(这有点意味着它们是一种反模式),我没有说任何关于使用静态范围的核心类。我是在指出几乎普遍使用 laravel 的代码以各种形式滥用静态范围。
  • @tereško 好的。只是想明确一点,Laravel(核心)不会滥用静态范围......

标签: php laravel static-methods


【解决方案1】:

这个问题本身是非常基于意见的。我不会说在你的模型中使用这样的方法一定不好,尽管我也不建议这样做。 (有关更多信息,请查看@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;

【讨论】:

    【解决方案2】:

    当您创建静态方法时,没有任何东西会固有地破坏,但与所有文档一样,不建议这样做。为什么?

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2011-09-20
      • 2011-10-06
      • 2015-03-09
      • 2019-09-25
      相关资源
      最近更新 更多