laravel - 在 Laravel 中,我应该在哪里在 repo 或 Controller 中触发事件和电子邮件?

标签 laravel repository-pattern laravel-mail laravel-events laravel-notification

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

最佳答案

这确实是一个广泛的问题,许多人都会提出自己的意见。在我看来,形成Laravel的上下文,我会根据操作定义我的事件类型。

例如,正如你提到的电子邮件/通知事件,我想这样想(这是一个假设的例子):

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

在这种情况下,注册后应向用户发送一封电子邮件,以便我可以使用事件在 Controller 中执行相同的操作,例如:
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
        }
    }
}

在这种情况下,我认为,事件调度应该在 Controller 中,因为它是我的应用程序层的一部分来控制应用程序流,因此,应该从 Controller 调度电子邮件发送事件。 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触发事件,所以保持简单,根据你的上下文做出合适的决定。

关于laravel - 在 Laravel 中,我应该在哪里在 repo 或 Controller 中触发事件和电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48600574/

相关文章:

repository - 使用 CQRS 的 DDD 中的通用存储库模式,它有意义吗?

c# - 如何解决这个通用的存储库模式问题?

php - 你如何在 Laravel 默认邮件中自定义变量?

Laravel 邮件错误 : Process could not be started [The system cannot find the path specified.]

asp.net-mvc-3 - 使用存储库模式获取最后插入的行 ID

laravel - Laravel 5-如何捕获Mail::send()错误?

php - 调用未定义的方法 Goutte\Client::setClient()

php - 带连接的 laravel 5.2 查询范围

javascript - AJAX Post 请求不适用于 Laravel

php - 在 laravel 中为 Controller 添加中间件