Как реализовать событие / слушатели с шаблоном репозитория в laravel 5.4 - PullRequest
0 голосов
/ 16 апреля 2019

Я не могу заставить слушателей запускать действие обновления, создавать или удалять, когда я использую хранилище patter.

Дополнительно я добавил свой код, чтобы помочь решить мою проблему.

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

}

Мой 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);
    }

}

Мой AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Entities\Event;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //event: creating
        Event::creating(function (Event $event) {
            return $event->creatingEvent();
        });

        //event: saving
        Event::saving(function (Event $event) {
            return $event->savingEvent();
        });

        //event: updating
        Event::updating(function (Event $event) {
            return $event->updatingEvent();
        });
    } 
}

Мой интерфейс IEvent.php:

<?php

namespace App\Http\Events\Contracts;

interface IEvent
{
    public function update($activityId, $params);
}

My ServicesOrchestration.php:

<?php
namespace App\Http\Administration\Providers;

use App\Entities\Event;

use App\Http\Administration\Repositories\RepoEvent;

use Illuminate\Support\ServiceProvider;

class ServicesOrchestration extends ServiceProvider
{
    public function boot()
    {

    }

    public function register()
    {
        $this->app->bind('App\Http\Administration\Contracts\IEvent', function () {
            return new RepoEvent(new Event());
        });
    }
}

Моя модель Event.php

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

спасибо заранее. Спасибо заранее. Спасибо заранее. Спасибо заранее. Спасибо заранее. Спасибозаранее

1 Ответ

0 голосов
/ 16 апреля 2019

Вот соответствующие отрывки из документов (прокрутите до массовых обновлений):

При массовом обновлении через Eloquent события модели saved и updated не будут запускаться для обновленных моделей. Это связано с тем, что модели никогда не извлекаются при массовом обновлении.

Чтобы ваш код работал, вам нужно сначала получить фактический экземпляр модели, как показано ниже:

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());
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...