#php #laravel #events #queue #illuminate
Вопрос:
CRM/ERP нашей компании немного устарели, и мы активно работаем над этим. Но мы планируем в ближайшее время перейти на Laravel. У меня была возможность перенести некоторые пакеты illuminate в проект, чтобы помочь этой миграции (так что мне не нужно все переписывать). Я использовал https://github.com/mattstauffer/Torch/ для «как это сделать». Теперь мне нужно запустить некоторые события и отправить несколько слушателей по очереди. Я смог заставить события и очереди работать отдельно. Но я хочу, чтобы некоторые слушатели стояли в очереди, как в Laravel.
Коды:
<?php
// init.php
require './vendor/autoload.php';
use AppAppFactory;
use IlluminateEventsEventServiceProvider;
use IlluminateRedisRedisManager;
use IlluminateQueueCapsuleManager as Queue;
$container = AppFactory::getInstance();
$container->instance('app', $container);
(new EventServiceProvider($container))->register();
$container['events']->listen(AppEventsPublishEvent::class, AppListenersPublishListener::class);
$container['events']->listen(AppEventsPublishEvent::class, 'AppListenersQueueListener@handle');
$container->bind('redis', function () use ($container) {
return new RedisManager($container, 'predis', [
'default' => [
'host' => '127.0.0.1',
'password' => null,
'port' => 6379,
'database' => 0,
],
]);
});
$container->bind('exception.handler', AppExceptionHandler::class);
$queue = new Queue($container);
$queue->addConnection([
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
]);
$container['queue'] = $queue->getQueueManager();
class DoThing
{
public function fire($job, $data)
{
$handle = fopen('proof.txt', 'a');
fwrite($handle, PHP_EOL . $data['string']);
$job->delete();
}
}
<?php
// trigger-event.php
require("init.php");
container['events']->dispatch(new AppEventsPublishEvent('data'));
<?php
// worker.php
require "init.php";
$queue = $container['queue'];
$events = $container['events'];
$handler = $container['exception.handler'];
$isDownForMaintenance = function () use ($container) {
return $container->isDownForMaintenance();
};
$worker = new IlluminateQueueWorker($queue, $events, $handler, $isDownForMaintenance);
$options = new IlluminateQueueWorkerOptions();
$worker->runNextJob('default', 'default', $options);
<?php
// PublishEvent
namespace AppEvents;
class PublishEvent
{
protected $data;
public function __construct($data)
{
$this->data = $data;
}
/**
* @return mixed
*/
public function getData()
{
return $this->data;
}
}
<?php
// Listener
namespace AppListeners;
use AppEventsPublishEvent;
use IlluminateContractsQueueShouldQueue;
class QueueListener implements ShouldQueue
{
public function handle(PublishEvent $event)
{
$handle = fopen('proof.txt', 'a');
fwrite($handle, PHP_EOL . "Queue");
}
}
I get the following error:
Fatal error: Uncaught IlluminateContractsContainerBindingResolutionException: Target [IlluminateContractsQueueFactory] is not instantiable.
I tried much different stuff but couldn’t make it work.
Thank you for your help!