在哪里放置Laravel Listener逻辑

时间:2016-11-16 14:11:57

标签: php laravel

我想在用户注册时关联订单(用户会话中保存的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']);
    }
}

任何其他建议也将不胜感激!

1 个答案:

答案 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'));
    }
}

通常,事件监听器是一种特定类型的服务,因此这对于未来的代码读取器应该是直观的。