2015-01-10 26 views
1

我是OOP的新手,所以在Laravel控制器中,这是一个基本的OOP问题。我是否在Laravel控制器中使用静态方法设置失败?

我试图创建一个用于创建Notification对象时会创建某些其他对象,编辑的通知系统系统,删除等,所以,举例来说,如果一个User编辑,然后我想生成一个Notification关于这个编辑。在此示例之后,我创建了UserObserver,保存User时调用NotificationController::store()

class UserObserver extends BaseObserver 
{ 
    public function saved($user) 
    { 
     $data = [ 
      // omitted from example 
     ]; 

     NotificationController::store($data); 
    } 
} 

为了使这项工作,我不得不使NotificationController::store()静态。

class NotificationController extends \BaseController { 
public static function store($data) 
{ 
    // validation omitted from example 

    $notification = Notification::create($data); 
} 

我只依稀熟悉的东西static手段,所以有超过内在的错误我在这里做什么可能的东西,但这似乎把工作做好,或多或少。然而,我读过的所有内容都表明,静态功能通常是不好的做法。每个人都说我在这里做的“错误”?我怎么能做得更好?

我将有几个其他Observer类将需要调用相同的NotificationController::store(),我想NotificationController::store()来处理$data的任何验证。

我刚开始学习单元测试。我在这里所做的是否会在测试方面造成困难?

回答

0

我已经在这里详细地写了关于静力学的文章:How Not To Kill Your Testability Using Statics。它适用于您的案例的要点如下:

静态函数调用夫妇代码。这是不可能的替代静态函数调用与其他任何或跳过这些调用,无论出于何种原因。 NotificationController::store()基本上与substr()属于同一类。现在,您可能不想用其他任何方式替代致电substr的电话;但有很多原因可能会导致您现在或以后替代NotificationController

单元测试只是一个非常明显的用例,其中替换是非常需要的。如果您想单独测试UserObserver::saved函数,因为它包含一个复杂的算法,您需要使用所有可能的输入来测试它以确保其正常工作,则无法将该算法从呼叫解耦到NotificationController::store()。而这个功能反过来可能会调用一些Model::save()方法,而后者又想要与数据库进行交谈。您需要设置这个所有其他不相关代码所需的全部环境(并且可能包含或不包含其自身的缺陷),从本质上来说简单地测试这一个函数本质上是不可能的。

如果你的代码看起来更象这样:

class UserObserver extends BaseObserver 
{ 
    public function saved($user) 
    { 
     $data = [ 
      // omitted from example 
     ]; 

     $this->NotificationController->store($data); 
    } 
} 

好,$this->NotificationController显然是可以在某些时候被取代的变量。最典型的是这个对象会在当时被注入实例化类:

new UserObserver($notificationController) 

你可以简单地注入模拟对象,它允许调用的任何方法,但是这只是什么都不做。然后你可以单独测试UserObserver::saved(),并确保它实际上没有bug。

通常情况下,使用依赖注入代码可以使您的应用程序更加灵活,并允许您将应用程序拆开。这对于单元测试是必需的,但在稍后您可能无法想象的场景中也会派上用场,但从现在开始半年将难倒,因为您需要重新构造并重构您的应用程序以获得您需要的某个新功能执行。注意:我从来没有写过一行Laravel代码,但据我了解,它支持某种形式的依赖注入。如果确实如此,那么您应该使用该功能。否则,要非常清楚代码中的哪些部分与哪些其他部分耦合,以及这会如何影响您将其拆分并稍后重构的能力。

相关问题