#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
его, он фактически создает новый объект построителя запросов