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

#laravel #design-patterns #listener #repository-pattern

#laravel #шаблоны проектирования #прослушиватель #репозиторий-шаблон

Вопрос:

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

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

TicketController.php

 namespace AppHttpOrganizerControllers;

use AppHttpControllersController;
use AppHttpEventsContractsIEvent;
use AppEntitiesEvent;

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 AppHttpEventsRepositories;

use AppHttpEventsContractsIEvent
;

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 AppProviders;

use IlluminateSupportServiceProvider;
use AppEntitiesEvent;

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 AppHttpEventsContracts;

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

Мой ServicesOrchestration.php:

 <?php
namespace AppHttpAdministrationProviders;

use AppEntitiesEvent;

use AppHttpAdministrationRepositoriesRepoEvent;

use IlluminateSupportServiceProvider;

class ServicesOrchestration extends ServiceProvider
{
    public function boot()
    {

    }

    public function register()
    {
        $this->app->bind('AppHttpAdministrationContractsIEvent', function () {
            return new RepoEvent(new Event());
        });
    }
}
  

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

 <?php

namespace AppEntities;

use IlluminateDatabaseEloquentModel;

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. Мы не можем догадаться, что может быть не так с вашим кодом. Вам нужно поделиться с нами своим кодом.

2. @apokryfos вот что у вас есть.

Ответ №1:

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

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

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

 public function update($activityId, $params)
{
    $instance = $this->model->find($activityId);
    $instance->fill($params);
    $instance->save();
}
  

Это повлечет за собой дополнительные затраты на выполнение двух запросов вместо одного и возможность одновременного обновления только одной модели.

Примечание: вы передаете экземпляр модели в репозиторий, но на самом деле вы хотите передать экземпляр построителя запросов:

 $this->app->bind('AppHttpAdministrationContractsIEvent', function () {
    return new RepoEvent(Event::query());
});
  

Комментарии:

1. Привет, ребята, не могли бы вы объяснить мне, почему я должен хотеть передать экземпляр построителя запросов.

2. where это метод построения запросов, а не метод модели. Когда вы вызываете where его, он фактически создает новый объект построителя запросов