如何在laravel 5.4中使用存储库模式实现事件/侦听器
当我使用模式库时,我不能让侦听器触发操作更新、创建或删除 此外,我还添加了代码,以帮助我的客户解决我的问题 TicketController.php如何在laravel 5.4中使用存储库模式实现事件/侦听器,laravel,design-patterns,listener,repository-pattern,Laravel,Design Patterns,Listener,Repository Pattern,当我使用模式库时,我不能让侦听器触发操作更新、创建或删除 此外,我还添加了代码,以帮助我的客户解决我的问题 TicketController.php namespace App\Http\Organizer\Controllers; use App\Http\Controllers\Controller; use App\Http\Events\Contracts\IEvent; use App\Entities\Event; class TicketController extends C
namespace App\Http\Organizer\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Events\Contracts\IEvent;
use App\Entities\Event;
class TicketController extends Controller
{
protected $IEvent;
public function __construct( IEvent $IEvent )
{
$this->IEvent = $IEvent;
}
public function checkFutbolType ($activityId)
{
// I need to listen this action here
$event = $this->IEvent->update(21927, ['title'=>'new title']);
}
}
My RepoEvent.php:
<?php
namespace App\Http\Events\Repositories;
use App\Http\Events\Contracts\IEvent
;
class RepoEvent implements IEvent
{
protected $model;
public function __construct($model)
{
$this->model = $model;
}
public function update($activityId, $params)
{
return $this->model->where('id', $activityId)->update($params);
}
}
<?php
namespace App\Http\Events\Contracts;
interface IEvent
{
public function update($activityId, $params);
}
以下是从(滚动到批量更新)中截取的相关内容:
通过Eloquent发布批量更新时,更新的模型不会触发保存的
和更新的
模型事件。这是因为在发布大规模更新时,从未实际检索模型
要使代码正常工作,首先需要检索实际的模型实例,如下所示:
public function update($activityId, $params)
{
$instance = $this->model->find($activityId);
$instance->fill($params);
$instance->save();
}
这将增加执行两个查询的额外成本,而不是一个查询,并且一次只能更新一个模型
旁注:您正在向存储库传递一个模型实例,但实际需要传递一个查询生成器实例:
$this->app->bind('App\Http\Administration\Contracts\IEvent', function () {
return new RepoEvent(Event::query());
});
我们猜不出你的代码有什么问题。您需要与我们共享您的代码。@apokryfos您已经有了。您好,请您解释一下为什么我要在中传递查询生成器实例。其中
是查询生成器方法而不是模型方法。当您调用where
时,它实际上会创建一个新的查询生成器对象
<?php
namespace App\Entities;
use Illuminate\Database\Eloquent\Model;
class Event extends Model
{
public function creatingUser() {
\Log::info('creating event');
}
public function savingUser() {
\Log::info('saving event');
}
public function updatingUser() {
\Log::info('updating event');
}
}
public function update($activityId, $params)
{
$instance = $this->model->find($activityId);
$instance->fill($params);
$instance->save();
}
$this->app->bind('App\Http\Administration\Contracts\IEvent', function () {
return new RepoEvent(Event::query());
});