我想在用户注册时关联订单(用户会话中保存的ID)。
我已经创建了Laravel网站中记录的事件和监听器。我遇到的问题是我不确定关联记录的逻辑应该去哪里,我最初把它放在Order Controller
中,但应用程序会尝试引用Builder :: attachOrderToUser。
我将方法移动到我的模型中但它现在有效但我现在给出了错误:
调用未定义的方法Illuminate \ Database \ Query \ Builder :: attach()
有人可以指出这个逻辑应该去哪里吗?
订单模型中的方法:
/**
* Attach Order to Customer
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public static function attachOrderToUser($order_id, $user_id)
{
// @TODO: Wrap around event handler
$user = User::find($user_id);
if($user->order()->attach($order_id))
return true;
else
return false;
}
这是我的听众代码:
namespace App\Listeners;
use App\Events\UserQuickSignUpComplete;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Auth;
use Session;
use App\Order;
use Illuminate\Http\Request;
class AttachGuestOrderToUser
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param UserQuickSignUpComplete $event
* @return void
*/
public function handle(UserQuickSignUpComplete $event)
{
// get currently logged in user (was signed in on method that triggers event)
$user = Auth::user();
// get order
$order = Session::get('last_transaction.order_id');
// attach order to user
Order::attachOrderToUser($order['order_id'], $user['id']);
}
}
任何其他建议也将不胜感激!
答案 0 :(得分:1)
将两个对象连接在一起作为服务读取给我。那么,这样的服务应该去哪里才是问题。控制器感觉不对,因为我们不控制用户操作。存储库感觉不对,因为我们正在处理两个独立的模型实例(而不是同一类模型的集合)。
但请查看事件监听器的名称:\App\Listeners\AttachGuestOrderToUser
。这是一个非常具体的名称,暗示了一项特定的工作。在我看来,该类已经是一项服务。因此,我只需将您需要的逻辑放在听众身上。
namespace App\Listeners;
use App\Events\UserQuickSignUpComplete;
class AttachGuestOrderToUser
{
/**
* You guessed it: attach a guest order to a specific user.
*
* @param UserQuickSignUpComplete $event
* @return void
*/
public function handle(UserQuickSignUpComplete $event)
{
\Auth::user()->order()->attach(\Session::get('last_transaction.order_id'));
}
}
通常,事件监听器是一种特定类型的服务,因此这对于未来的代码读取器应该是直观的。