Hola Habr Recientemente tuve un proyecto interesante en mis manos, que, a pesar de su simplicidad, exigía no usar ningún marco. No se habló de paquetes, por lo que se decidió utilizar los componentes habituales de Laravel. Si necesita usar colas, Eloquent o un contenedor, bienvenido a cat.
Sobre la simplicidad de dividir el marco en componentes
Comenzando con Laravel 4, todos los componentes son paquetes separados, que en teoría pueden funcionar en cualquier proyecto PHP. Sin embargo, algunos componentes requieren personalización adicional, que en el marco principal está oculta debajo del capó.
Componentes
Contenedor
De todos los componentes bajo consideración, illuminate/container
es el más fácil de instalar y usar.
<?php use Illuminate\Container\Container; $container = Container::getInstance(); return $container->make(Foo::class);
Sin embargo, llamar a un método estático en la clase Container
cada vez que usa un contenedor no es una buena idea. El app()
está disponible en el marco, que nos devolverá la instancia del contenedor global, sin embargo, necesitamos crear una manualmente.
Cree un archivo helpers.php
para dichos ayudantes y agréguelo al inicio.
"autoload": { "files": [ "src/helpers.php" ], "psr-4": { "YourApp\\": "src/" } }
Agregue la app()
ayudante al archivo.
<?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); } }
Listo Puedes intentar usar un ayudante.
<?php return app(Foo::class);
Generador de consultas y elocuente
Para usar el componente illuminate/database
, usaremos Capsule\Manager
, una clase diseñada para trabajar con el generador de consultas fuera de Laravel.
Comencemos configurando una conexión a la base de datos. Es recomendable llevar a cabo esta configuración en la etapa de inicio de su aplicación, inmediatamente después de conectar 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' => '', ]);
Puede comenzar con el generador de consultas.
<?php use Illuminate\Database\Capsule\Manager; return Manager::table('orders')->get();
¿Qué hay de Eloquent?
<?php namespace YourApp\Models; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $fillable = [ 'name', ]; }
<?php use YourApp\Models\Order; Order::first();
La situación es más complicada con las migraciones: por un lado, hay un Schema Builder en el kit. Por otro lado, no existe un mecanismo automático para iniciar las migraciones.
<?php use Illuminate\Database\Capsule\Manager; Manager::schema()->create('orders', function ($table) { $table->bigIncrements('id'); $table->string('name'); $table->timestamps(); });
Para comenzar, simplemente ejecute el archivo con migración: php migration.php
Colas
Las colas también tienen su propia Capsule
, sin embargo, los análogos de queue:work
y queue:listen
deben escribirse manualmente.
Comencemos con la clase Application
. En Laravel, esta clase se usa como una instancia de contenedor global que, además de los métodos Illuminate\Container\Container
, contiene métodos auxiliares para trabajar con el marco (versión actual, rutas de almacenamiento, recursos). Sin embargo, nuestra clase contendrá solo un método: isDownForMaintenance
. Es necesario para el trabajo del trabajador, ya que determina el estado de la aplicación en este momento.
<?php namespace YourApp; use Illuminate\Container\Container; class Application extends Container { public function isDownForMaintenance() { return false; } }
A continuación, debemos registrar el proveedor de illuminate/events
y vincular el Illuminate\Contracts\Events\Dispatcher
al alias de events
.
<?php use YourApp\Application; use Illuminate\Contracts\Events\Dispatcher; $application = Application::getInstance(); $application->bind(Dispatcher::class, 'events');
Ahora necesita crear la instancia de Capsule
y agregar las configuraciones de conexión allí.
Ejemplo de configuración para la base de datos
<?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');
Ejemplo de configuración para Redis (requiere 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();
El último paso en la configuración es agregar un controlador de excepciones analógico.
<?php use Illuminate\Contracts\Debug\ExceptionHandler; class Handler implements ExceptionHandler { public function report(Exception $e) {
Configuración de cola completada. Ahora puede comenzar a escribir 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);
Ahora, para iniciar un trabajador de cola, simplemente escriba php worker.php
.
Si es necesario usar queue:listen
, entonces necesita crear dos archivos separados. Uno es un demonio que escucha la cola y ejecuta un segundo archivo en cada nuevo trabajo. El segundo archivo, a su vez, actúa como el ejecutor de la tarea.
trabajador.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);
Pasamos a usar. Todos los métodos se pueden ver en la API.
<?php use Illuminate\Queue\Capsule\Manager; Manager::push(SomeJob::class);