我在使用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] 删除。
我来说两句