Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在laravel 5.4中使用存储库模式实现事件/侦听器_Laravel_Design Patterns_Listener_Repository Pattern - Fatal编程技术网

如何在laravel 5.4中使用存储库模式实现事件/侦听器

如何在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

当我使用模式库时,我不能让侦听器触发操作更新、创建或删除

此外,我还添加了代码,以帮助我的客户解决我的问题

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 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());
});