在 Laravel 中,我应该在回购协议或控制器中的什么地方触发事件和电子邮件?
In Laravel, Where I should fire events and emails in repo or in controller?
我在使用 laravel 开发应用程序时使用存储库模式,我的问题是我必须在哪里为火灾事件编写代码、发送电子邮件或发送通知?为什么?
这确实是一个广泛的问题,许多人会提出自己的意见。在我看来,形成 Laravel
的上下文,我会根据操作定义我的事件类型。
因此,例如,正如您提到的 email/notification 事件,我想这样想(这是一个假设的例子):
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
的一部分,所以就是这样。
现在,考虑另一个假设示例,假设您的 UserController
中有一个 delete
方法,如下所示:
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
}
}
请注意,删除方法中没有发生相关操作,因为我可能会在 UserRepository
内部触发一个事件,因为此删除操作涉及其他一些 domain/business 相关操作和应用程序层不应该关心它(在这种情况下),因为删除用户会影响其他一些域对象,所以我将以这种方式处理该事件。
无论如何,这只是我的想法,只是一个意见。也许在现实世界的情况下,我可以想出一个不同的想法,所以这取决于你,这取决于你应该考虑的上下文,最后 Laravel 中没有推荐的方法,你甚至可以使用 Models
触发事件,所以保持简单,根据您的上下文做出适合的决定。
我在使用 laravel 开发应用程序时使用存储库模式,我的问题是我必须在哪里为火灾事件编写代码、发送电子邮件或发送通知?为什么?
这确实是一个广泛的问题,许多人会提出自己的意见。在我看来,形成 Laravel
的上下文,我会根据操作定义我的事件类型。
因此,例如,正如您提到的 email/notification 事件,我想这样想(这是一个假设的例子):
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
的一部分,所以就是这样。
现在,考虑另一个假设示例,假设您的 UserController
中有一个 delete
方法,如下所示:
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
}
}
请注意,删除方法中没有发生相关操作,因为我可能会在 UserRepository
内部触发一个事件,因为此删除操作涉及其他一些 domain/business 相关操作和应用程序层不应该关心它(在这种情况下),因为删除用户会影响其他一些域对象,所以我将以这种方式处理该事件。
无论如何,这只是我的想法,只是一个意见。也许在现实世界的情况下,我可以想出一个不同的想法,所以这取决于你,这取决于你应该考虑的上下文,最后 Laravel 中没有推荐的方法,你甚至可以使用 Models
触发事件,所以保持简单,根据您的上下文做出适合的决定。