Manual Configuration (without yiisoft/config)
This guide explains how to set up the queue component manually, without using yiisoft/config.
To use the queue, you need to create instances of the following classes:
- Adapter - handles the actual queue backend (e.g.,
SynchronousAdapter, or an adapter from external packages like Redis, AMQP, etc.) - Worker - processes messages from the queue
- Queue - the main entry point for pushing messages
use Yiisoft\Queue\Adapter\SynchronousAdapter;
use Yiisoft\Queue\Queue;
use Yiisoft\Queue\Worker\Worker;
use Yiisoft\Queue\Middleware\CallableFactory;
use Yiisoft\Queue\Middleware\Consume\ConsumeMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\Consume\MiddlewareFactoryConsume;
use Yiisoft\Queue\Middleware\FailureHandling\FailureMiddlewareDispatcher;
use Yiisoft\Queue\Middleware\FailureHandling\MiddlewareFactoryFailure;
use Yiisoft\Queue\Middleware\Push\MiddlewareFactoryPush;
use Yiisoft\Queue\Middleware\Push\PushMiddlewareDispatcher;
use Psr\Container\ContainerInterface;
// You need a PSR-11 container for dependency injection
/** @var ContainerInterface $container */
// Define message handlers
$handlers = [
'file-download' => [FileDownloader::class, 'handle'],
FileDownloader::class => [FileDownloader::class, 'handle'],
];
$callableFactory = new CallableFactory($container);
// Create middleware dispatchers
$consumeMiddlewareDispatcher = new ConsumeMiddlewareDispatcher(
new MiddlewareFactoryConsume($container, $callableFactory),
);
$failureMiddlewareDispatcher = new FailureMiddlewareDispatcher(
new MiddlewareFactoryFailure($container, $callableFactory),
[],
);
$pushMiddlewareDispatcher = new PushMiddlewareDispatcher(
new MiddlewareFactoryPush($container),
);
// Create worker
$worker = new Worker(
$handlers,
$container->get(\Psr\Log\LoggerInterface::class),
$container->get(\Yiisoft\Injector\Injector::class),
$container,
$consumeMiddlewareDispatcher,
$failureMiddlewareDispatcher,
$callableFactory,
);
// Create queue with adapter
$queue = new Queue(
$worker,
$pushMiddlewareDispatcher,
$container->get(\Psr\EventDispatcher\EventDispatcherInterface::class),
new SynchronousAdapter($worker, /* queue instance will be set via withAdapter */),
);
// Now you can push messages
$message = new \Yiisoft\Queue\Message\Message('file-download', ['url' => 'https://example.com/file.pdf']);
$queue->push($message);For multiple queue names, use AdapterFactoryQueueProvider:
use Yiisoft\Queue\Provider\AdapterFactoryQueueProvider;
use Yiisoft\Queue\Adapter\SynchronousAdapter;
$definitions = [
'queue1' => new SynchronousAdapter($worker, $queue),
'queue2' => static fn(SynchronousAdapter $adapter) => $adapter->withChannel('channel2'),
];
$provider = new AdapterFactoryQueueProvider(
$queue,
$definitions,
$container,
);
$queueForQueue1 = $provider->get('queue1');
$queueForQueue2 = $provider->get('queue2');$queue->run(); // Process all messages
$queue->run(10); // Process up to 10 messages$queue->listen(); // Run indefinitely- Usage basics - learn how to create messages and handlers
- Workers - understand handler formats
- Error handling - configure retries and failure handling
- Adapter list - choose a production-ready adapter