Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我是否在Laravel控制器中使用静态方法设置自己的故障?_Php_Oop_Laravel 4_Static Methods - Fatal编程技术网

Php 我是否在Laravel控制器中使用静态方法设置自己的故障?

Php 我是否在Laravel控制器中使用静态方法设置自己的故障?,php,oop,laravel-4,static-methods,Php,Oop,Laravel 4,Static Methods,我对OOP很陌生,所以在Laravel控制器的上下文中,这确实是一个基本的OOP问题 我正在尝试创建一个通知系统,该系统在创建、编辑、删除某些其他对象时创建通知对象。因此,例如,如果编辑了用户,则我希望生成有关此编辑的通知。在这个示例之后,我创建了UserObserver,它在保存用户时调用NotificationController::store() class UserObserver extends BaseObserver { public function saved($use

我对OOP很陌生,所以在Laravel控制器的上下文中,这确实是一个基本的OOP问题

我正在尝试创建一个通知系统,该系统在创建、编辑、删除某些其他对象时创建
通知
对象。因此,例如,如果编辑了
用户
,则我希望生成有关此编辑的
通知
。在这个示例之后,我创建了
UserObserver
,它在保存
用户时调用
NotificationController::store()

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

        NotificationController::store($data);
    }
}
为了实现这一点,我必须使
NotificationController::store()
static

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

    $notification = Notification::create($data);
}
我只是对静态的意思略知一二,所以我在这里做的事情很可能有内在的错误,但这似乎或多或少地完成了工作。然而,我读到的所有东西都表明静态函数通常是不好的实践。佩尔说,我在这里做的是“错误的”吗?我怎样才能做得更好

我将有几个其他的观察者类需要调用相同的
NotificationController::store()
,我希望
NotificationController::store()
来处理
$data
的任何验证


我刚刚开始学习单元测试。我在这里所做的会使测试变得困难吗?

我在这里大量地写过关于静态的文章:。适用于您的案例的要点如下:

静态函数调用耦合代码。无论出于何种原因,都不可能用任何其他内容替换静态函数调用或跳过这些调用
NotificationController::store()
本质上与
substr()
属于同一类。现在,您可能不想用任何其他方法代替对
substr
的调用;但是,现在或以后,您可能需要替换
NotificationController
,原因有很多

单元测试只是一个非常明显的用例,其中替换是非常可取的。如果您想单独测试
UserObserver::saved
函数,因为它包含一个复杂的算法,您需要使用所有可能的输入进行测试,以确保它正常工作,那么您无法将该算法与对
NotificationController::store()的调用解耦。该函数可能会依次调用一些
Model::save()
方法,而这些方法又希望与数据库通信。您需要建立一个完整的环境,所有其他无关的代码都需要这个环境(可能包含也可能不包含它自己的bug),它本质上不可能单独测试这个函数

如果您的代码看起来更像这样:

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

        $this->NotificationController->store($data);
    }
}
嗯,
$this->NotificationController
显然是一个变量,可以在某个时候替换。最典型的情况是,该对象将在实例化该类时注入:

new UserObserver($notificationController)
您可以简单地注入一个mock对象,它允许调用任何方法,但它什么也不做。然后您可以单独测试
UserObserver::saved()
,并确保它实际上没有bug

通常,使用依赖注入代码可以使应用程序更加灵活,并允许您将其拆分。这对于单元测试来说是必要的,但在以后的场景中也会派上用场,这些场景你现在甚至无法想象,但在半年后你会遇到困难,因为你需要重组和重构你的应用程序,以实现一些你想要实现的新功能

警告:我从未编写过一行Laravel代码,但据我所知,它确实支持某种形式的依赖注入。如果真的是这样的话,那么您肯定应该使用该功能。否则,要非常清楚您的代码的哪些部分与哪些其他部分耦合,以及这将如何影响您以后分解和重构代码的能力