Oi Habr. Recentemente, tenho um projeto interessante em minhas mãos, que, apesar de sua simplicidade, exigia não usar nenhuma estrutura. Não se falava em pacotes, por isso foi decidido usar os componentes usuais do Laravel. Se você precisar usar filas, Eloquent ou um contêiner - bem-vindo ao gato.
Sobre a simplicidade de dividir a estrutura em componentes
Começando com o Laravel 4, todos os componentes são pacotes separados, que em teoria podem ser criados para funcionar em qualquer projeto PHP. No entanto, alguns componentes requerem personalização adicional, que na estrutura principal está oculta.
Componentes
Container
De todos os componentes em consideração, illuminate/container
é o mais fácil de instalar e usar.
<?php use Illuminate\Container\Container; $container = Container::getInstance(); return $container->make(Foo::class);
No entanto, chamar um método estático na classe Container
toda vez que você usa um contêiner não é uma boa ideia. O app()
está disponível na estrutura, que retornará a instância do contêiner global para nós; no entanto, precisamos criar uma manualmente.
Crie um arquivo helpers.php
para esses auxiliares e adicione-o na inicialização.
"autoload": { "files": [ "src/helpers.php" ], "psr-4": { "YourApp\\": "src/" } }
Adicione o auxiliar app()
ao arquivo.
<?php use Illuminate\Container\Container; if (! function_exists('app')) { function app($abstract = null, array $parameters = []) { if (is_null($abstract)) { return Container::getInstance(); } return Container::getInstance()->make($abstract, $parameters); } }
Feito. Você pode tentar usar um ajudante.
<?php return app(Foo::class);
Criador de consultas e eloquente
Para usar o componente illuminate/database
, usaremos Capsule\Manager
, uma classe projetada para trabalhar com o construtor de consultas fora do Laravel.
Vamos começar configurando uma conexão com o banco de dados. É aconselhável realizar essa configuração no estágio de inicialização do seu aplicativo, imediatamente após conectar o autoload.php
.
<?php require_once __DIR__.'/../vendor/autoload.php'; use Illuminate\Database\Capsule\Manager; $manager = new Manager; $manager->addConnection([ 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'database', 'username' => 'root', 'password' => 'password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ]);
Você pode começar com o construtor de consultas.
<?php use Illuminate\Database\Capsule\Manager; return Manager::table('orders')->get();
E o Eloquent?
<?php namespace YourApp\Models; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $fillable = [ 'name', ]; }
<?php use YourApp\Models\Order; Order::first();
A situação é mais complicada com as migrações - por um lado, há um Schema Builder no kit. Por outro lado, não há mecanismo automático para iniciar migrações.
<?php use Illuminate\Database\Capsule\Manager; Manager::schema()->create('orders', function ($table) { $table->bigIncrements('id'); $table->string('name'); $table->timestamps(); });
Para começar, basta executar o arquivo com a migração: php migration.php
Filas
As filas também têm sua própria Capsule
, no entanto, os análogos da queue:work
e queue:listen
devem ser gravados manualmente.
Vamos começar com a classe Application
. No Laravel, essa classe é usada como uma instância global de contêiner, que, além dos métodos Illuminate\Container\Container
, contém métodos auxiliares para trabalhar com a estrutura (versão atual, caminhos de armazenamento, recursos). No entanto, nossa classe conterá apenas um método - isDownForMaintenance
. É necessário para o trabalho do trabalhador, pois determina o estado do aplicativo no momento.
<?php namespace YourApp; use Illuminate\Container\Container; class Application extends Container { public function isDownForMaintenance() { return false; } }
Em seguida, precisamos registrar o provedor de illuminate/events
e vincular o Illuminate\Contracts\Events\Dispatcher
ao alias de events
.
<?php use YourApp\Application; use Illuminate\Contracts\Events\Dispatcher; $application = Application::getInstance(); $application->bind(Dispatcher::class, 'events');
Agora você precisa criar a instância do Capsule
e adicionar as configurações de conexão lá.
Exemplo de configuração para o banco de dados
<?php use YourApp\Application; use Illuminate\Queue\Capsule\Manager; use Illuminate\Database\Capsule\Manager as DB; use Illuminate\Database\ConnectionResolver; $container = Application::getInstance(); $queue = new Manager($container); $queue->addConnection([ 'driver' => 'database', 'table' => 'jobs', 'connection' => 'default', 'queue' => 'default', ], 'default');
Exemplo de configuração para Redis (requer illuminate/redis
)
<?php use Illuminate\Redis\RedisManager; use Illuminate\Queue\Capsule\Manager; $container->bind('redis', function () use ($container) { return new RedisManager($container, 'predis', [ 'default' => [ 'host' => '127.0.0.1', 'password' => null, 'port' => 6379, 'database' => 0, ] ]); }); $queue = new Manager($container); $queue->addConnection([ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', ], 'default'); $queue->setAsGlobal();
A etapa final da configuração é adicionar um manipulador de exceção analógico.
<?php use Illuminate\Contracts\Debug\ExceptionHandler; class Handler implements ExceptionHandler { public function report(Exception $e) {
Configuração de fila concluída. Agora você pode começar a escrever na queue:work
.
<?php require_once __DIR__.'/bootstrap/bootstrap.php'; use Illuminate\Queue\Worker; use Illuminate\Queue\Capsule\Manager; use Illuminate\Queue\WorkerOptions; $queueManager = Manager::getQueueManager(); $worker = new Worker($queueManager, app('events'), app('exception.handler')); $worker->daemon('default', 'default', new WorkerOptions);
Agora, para iniciar um trabalhador de fila, basta escrever php worker.php
.
Se houver necessidade de usar a queue:listen
, será necessário criar dois arquivos separados. Um é um daemon que escuta a fila e executa um segundo arquivo em cada novo trabalho. O segundo arquivo, por sua vez, atua como o executor da tarefa.
worker.php
<?php require_once __DIR__.'/bootstrap/bootstrap.php'; use Illuminate\Queue\Listener; use Illuminate\Queue\ListenerOptions;
work.php
<?php require_once 'bootstrap/bootstrap.php'; use Illuminate\Queue\Worker; use Illuminate\Queue\WorkerOptions; use Illuminate\Queue\Capsule\Manager; $queueManager = Manager::getQueueManager(); $worker = new Worker($queueManager, app('events'), app('exception.handler')); $worker->runNextJob('default', 'default', new WorkerOptions);
Passamos a usar. Todos os métodos podem ser visualizados na API.
<?php use Illuminate\Queue\Capsule\Manager; Manager::push(SomeJob::class);