Skip to content

Commit c0865d9

Browse files
committed
fast-ext for disabled event listener
1 parent 73913c2 commit c0865d9

File tree

4 files changed

+61
-30
lines changed

4 files changed

+61
-30
lines changed

phpstan-baseline.neon

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,21 @@ parameters:
66
path: src/Commands/IndexCommand.php
77

88
-
9-
message: "#^Call to an undefined method Illuminate\\\\Database\\\\Eloquent\\\\Model\\|Limenet\\\\LaravelElasticaBridge\\\\Model\\\\ElasticsearchableInterface\\:\\:getElasticsearchId\\(\\)\\.$#"
9+
message: "#^Unable to resolve the template type TKey in call to function collect$#"
1010
count: 1
11-
path: src/Index/AbstractIndex.php
11+
path: src/Events/EventHandler.php
1212

1313
-
14-
message: "#^Parameter \\#2 \\$listener of static method Illuminate\\\\Events\\\\Dispatcher\\:\\:listen\\(\\) expects array\\|Closure\\|string\\|null, Illuminate\\\\Events\\\\QueuedClosure given\\.$#"
14+
message: "#^Unable to resolve the template type TValue in call to function collect$#"
1515
count: 1
16-
path: src/LaravelElasticaBridgeServiceProvider.php
16+
path: src/Events/EventHandler.php
17+
18+
-
19+
message: "#^Call to an undefined method Illuminate\\\\Database\\\\Eloquent\\\\Model\\|Limenet\\\\LaravelElasticaBridge\\\\Model\\\\ElasticsearchableInterface\\:\\:getElasticsearchId\\(\\)\\.$#"
20+
count: 1
21+
path: src/Index/AbstractIndex.php
1722

1823
-
19-
message: "#^Parameter \\#2 \\$model of method Limenet\\\\LaravelElasticaBridge\\\\Services\\\\ModelEventListener\\:\\:handle\\(\\) expects Illuminate\\\\Database\\\\Eloquent\\\\Model&Limenet\\\\LaravelElasticaBridge\\\\Model\\\\ElasticsearchableInterface, Illuminate\\\\Database\\\\Eloquent\\\\Model given\\.$#"
24+
message: "#^Cannot access offset 'events' on Illuminate\\\\Contracts\\\\Foundation\\\\Application\\.$#"
2025
count: 1
2126
path: src/LaravelElasticaBridgeServiceProvider.php

src/Events/EventHandler.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace Limenet\LaravelElasticaBridge\Events;
4+
5+
use Illuminate\Contracts\Events\Dispatcher;
6+
use Illuminate\Database\Eloquent\Model;
7+
use Limenet\LaravelElasticaBridge\Client\ElasticaClient;
8+
use Limenet\LaravelElasticaBridge\Services\ModelEventListener;
9+
10+
class EventHandler
11+
{
12+
public function __construct(
13+
private ElasticaClient $elasticaClient,
14+
private ModelEventListener $modelEventListener
15+
) {
16+
}
17+
18+
public function subscribe(Dispatcher $events): void
19+
{
20+
$events->listen(
21+
collect(ModelEventListener::EVENTS)
22+
->map(fn (string $name): string => sprintf('eloquent.%s:*', $name))
23+
->toArray(),
24+
function ($event, $models) {
25+
if (! $this->elasticaClient->listensToEvents()) {
26+
return;
27+
}
28+
29+
dispatch(function () use ($event, $models): void {
30+
$name = (str($event)->before(':')->after('.'));
31+
if (! $this->elasticaClient->listensToEvents()) {
32+
return;
33+
}
34+
35+
collect($models)->each(fn (Model $model) => $this->modelEventListener->handle($name, $model));
36+
})->onConnection(config('elastica-bridge.connection'));
37+
});
38+
}
39+
}

src/LaravelElasticaBridgeServiceProvider.php

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,10 @@
44

55
namespace Limenet\LaravelElasticaBridge;
66

7-
use Illuminate\Database\Eloquent\Model;
8-
use function Illuminate\Events\queueable;
9-
use Illuminate\Support\Facades\Event;
107
use Limenet\LaravelElasticaBridge\Client\ElasticaClient;
118
use Limenet\LaravelElasticaBridge\Commands\IndexCommand;
129
use Limenet\LaravelElasticaBridge\Commands\StatusCommand;
10+
use Limenet\LaravelElasticaBridge\Events\EventHandler;
1311
use Limenet\LaravelElasticaBridge\Repository\IndexRepository;
1412
use Limenet\LaravelElasticaBridge\Services\ModelEventListener;
1513
use Spatie\LaravelPackageTools\Package;
@@ -39,22 +37,7 @@ public function packageRegistered(): void
3937
$this->app->when(IndexRepository::class)
4038
->needs('$indices')
4139
->giveTagged('elasticaBridgeIndices');
42-
}
43-
44-
public function packageBooted(): void
45-
{
46-
foreach (ModelEventListener::EVENTS as $name) {
47-
Event::listen(
48-
sprintf('eloquent.%s:*', $name),
49-
queueable(function (string $event, array $models) use ($name): void {
50-
if (! resolve(ElasticaClient::class)->listensToEvents()) {
51-
return;
52-
}
5340

54-
$modelEventListener = resolve(ModelEventListener::class);
55-
collect($models)->each(fn (Model $model) => $modelEventListener->handle($name, $model));
56-
})->onConnection(config('elastica-bridge.connection'))
57-
);
58-
}
41+
$this->app['events']->subscribe(EventHandler::class);
5942
}
6043
}

src/Services/ModelEventListener.php

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212

1313
class ModelEventListener
1414
{
15-
public const EVENT_CREATED = 'created';
15+
private const EVENT_CREATED = 'created';
1616

17-
public const EVENT_UPDATED = 'updated';
17+
private const EVENT_UPDATED = 'updated';
1818

19-
public const EVENT_SAVED = 'saved';
19+
private const EVENT_SAVED = 'saved';
2020

21-
public const EVENT_RESTORED = 'restored';
21+
private const EVENT_RESTORED = 'restored';
2222

23-
public const EVENT_DELETED = 'deleted';
23+
private const EVENT_DELETED = 'deleted';
2424

2525
public const EVENTS = [
2626
self::EVENT_CREATED,
@@ -34,9 +34,13 @@ public function __construct(protected IndexRepository $indexRepository)
3434
{
3535
}
3636

37-
/** @param ElasticsearchableInterface&Model $model */
37+
/** @param Model $model */
3838
public function handle(string $event, Model $model): void
3939
{
40+
if (! $model instanceof ElasticsearchableInterface) {
41+
return;
42+
}
43+
4044
foreach ($this->matchingIndicesForElement($model) as $index) {
4145
if (! $index->getElasticaIndex()->exists()) {
4246
continue;

0 commit comments

Comments
 (0)