在Laravel中,我应该在回购或控制器中触发事件和电子邮件的位置?

哈姆扎

我在使用laravel开发应用程序时使用存储库模式,我的问题是我必须在哪里编写火灾事件代码,发送电子邮件或发送通知?为什么呢?

阿尔法

这确实是一个广泛的问题,许多人会提出自己的看法。我认为,从的上下文开始Laravel,我将根据操作定义事件的类型。

因此,例如,当您提到电子邮件/通知事件时,我想这样想(这是一个假设的示例):

class UserController
{
    public function register(Request $request, UserRepository $user)
    {
        if ($user = $user->register($request->all())) {
            Email::send(...);
        }
    }
}

在这种情况下,注册后应该向用户发送电子邮件,以便我可以使用事件在控制器内执行相同的操作,例如:

class UserController
{
    public function register(Request $request, UserRepository $user)
    {
        try {

            $user = $user->register($request->all());

            Event::fire('user_registered', $user);

        } catch(RegistrationException $e) {
            // Handle the exception
        }
    }
}

在这种情况下,我认为事件分发应该在控制器中,因为这是我的应用程序层控制应用程序流的一部分,因此,电子邮件发送事件应该从控制器中分发。UserRepository不应该关心你的应用程序的流量,发送电子邮件给用户的是不是你的一部分UserRepository,所以这是它。

现在,想想另一个假设的例子,说你一个delete在你的方法UserController下面给出:

class UserController
{
    public function delete(UserRepository $user, $id)
    {
        if($user->findOrFail($id)->delete()) {
            Post::where('user_id', $id)->delete();
        }

    }
}

好吧,在这种情况下,删除用户涉及一些与域相关的操作,因此我将重写如下所示的方法:

public function delete(UserRepository $user, $id)
{
    try {

        $user->delete($id);

        return redirect('/users'); // show users index page

    } catch (InvalidOperationException $e) {
        // Handle the custom exception thrown from UserRepository
    }
}

请注意,在delete方法中没有发生任何相关的操作,因为我可能会在内部触发一个事件,UserRepository因为此删除操作涉及其他与域/业务相关的其他操作,并且应用层不关心该操作(在这种情况下),因为删除用户会影响其他一些域对象,因此我将以这种方式处理该事件。

无论如何,这只是我的思维方式,只是一种意见。也许在现实世界中,我可以提出一个不同的主意,这取决于您,具体取决于您应考虑的上下文,最后Laravel中没有建议的方法,您甚至可以使用它Models引发事件,所以只要保持简单易行,请根据您的实际情况做出合适的决定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我应该在哪里在模型或控制器中编写查询(序列化)?

我应该在控制器或服务中记录错误?

什么时候应该在控制器和模型中编写代码?

在Laravel中,如果已经在检查中间件,是否应该在控制器中检查权限?

我应该在控制器和域服务之间放置命令总线吗?

可以由多个控制器和命令使用的Laravel方法。应该在哪里?

对于Flutter插件,我应该在Swift本机代码中传递哪个视图控制器?

我应该在控制器中设置父级,还是一个糟糕的主意?

控制器位于应用程序层还是基础架构层中?我是否应该在Clean Architecture中使用控制器?

为什么认证应该在过滤器而不是控制器中实现?

在电子邮件中添加图像(不作为链接资源),但应该在Outlook中可见

为什么我应该在Laravel中使用事件和侦听器

我应该在ASP.NET-MVC 5项目中的哪个位置存储WebAPI控制器?

我应该在@登录电子邮件之前删除所有圆点吗

我应该在ssh公钥中使用个人电子邮件吗?

当我通过 3rd 方邮件服务器从我的 php 代码发送电子邮件时,我应该在哪里保存我的电子邮件?

我应该在不同的SATA控制器之间分配驱动器吗?

我应该在哪里放置一个我想在多个控制器中使用的函数,而不仅仅是在我创建它的控制器中?

我应该在 initramfs 中挂载和卸载什么?

如果我的应用程序在各种视图控制器中都使用位置管理器,我应该在哪里实例化它?

什么时候应该在Rails中创建单独的控制器而不是自定义操作?

Angular的新功能:这应该在服务中使用还是可以保留在控制器中?

Symfony:有关格式化参数的逻辑应该在存储库还是控制器中?

我应该在哪里放置逻辑以加载视图控制器?

我应该在Elixir Phoenix的控制器或模型中使用Ecto.Repo吗?

我应该在哪里安装TFS 2013测试控制器?

我应该在哪里获取推文?(控制器,模型,助手等)

如何在控制器Rails中获取电子邮件

从codeigniter控制器发送电子邮件后,无法在jquery中获得响应