Hallo Habr. Kürzlich hatte ich ein interessantes Projekt in der Hand, das trotz seiner Einfachheit keine Rahmenbedingungen erforderte. Da von Paketen keine Rede war, wurde beschlossen, die üblichen Laravel-Komponenten zu verwenden. Wenn Sie Warteschlangen, Eloquent oder einen Container verwenden müssen - willkommen bei cat.
Über die Einfachheit der Aufteilung des Frameworks in Komponenten
Ab Laravel 4 sind alle Komponenten separate Pakete, die theoretisch in jedem PHP-Projekt zum Laufen gebracht werden können. Einige Komponenten erfordern jedoch zusätzliche Anpassungen, die im Hauptrahmen unter der Haube verborgen sind.
Komponenten
Behälter
Von allen betrachteten Komponenten ist die illuminate/container
am einfachsten zu installieren und zu verwenden.
<?php use Illuminate\Container\Container; $container = Container::getInstance(); return $container->make(Foo::class);
Es ist jedoch keine gute Idee, bei jeder Verwendung eines Containers eine statische Methode für die Container
Klasse aufzurufen. Der app()
ist im Framework verfügbar, der die globale Containerinstanz an uns zurückgibt. Wir müssen jedoch eine manuell erstellen.
Erstellen Sie eine helpers.php
Datei für solche Helfer und fügen Sie sie dem Start hinzu.
"autoload": { "files": [ "src/helpers.php" ], "psr-4": { "YourApp\\": "src/" } }
Fügen Sie der Datei den Helfer app()
.
<?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); } }
Fertig Sie können versuchen, einen Helfer zu verwenden.
<?php return app(Foo::class);
Query Builder und Eloquent
Um die illuminate/database
, verwenden wir Capsule\Manager
, eine Klasse, die für die Zusammenarbeit mit dem Abfrage-Generator außerhalb von Laravel entwickelt wurde.
Beginnen wir mit dem Aufbau einer Verbindung zur Datenbank. Es ist ratsam, diese Konfiguration in der Startphase Ihrer Anwendung unmittelbar nach dem autoload.php
Verbindung zu 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' => '', ]);
Sie können mit dem Abfrage-Generator beginnen.
<?php use Illuminate\Database\Capsule\Manager; return Manager::table('orders')->get();
Was ist mit Eloquent?
<?php namespace YourApp\Models; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $fillable = [ 'name', ]; }
<?php use YourApp\Models\Order; Order::first();
Bei Migrationen ist die Situation komplizierter - zum einen enthält das Kit einen Schema Builder. Andererseits gibt es keinen automatischen Mechanismus zum Starten von Migrationen.
<?php use Illuminate\Database\Capsule\Manager; Manager::schema()->create('orders', function ($table) { $table->bigIncrements('id'); $table->string('name'); $table->timestamps(); });
Um zu beginnen, führen Sie einfach die Datei mit der Migration aus: php migration.php
Warteschlangen
Warteschlangen haben auch eine eigene Capsule
, die Entsprechungen von queue:work
und queue:listen
müssen jedoch manuell geschrieben werden.
Beginnen wir mit der Application
Klasse. In Laravel wird diese Klasse als globale Containerinstanz verwendet, die zusätzlich zu den Illuminate\Container\Container
Methoden Hilfsmethoden für die Arbeit mit dem Framework enthält (aktuelle Version, Speicherpfade, Ressourcen). Unsere Klasse enthält jedoch nur eine Methode - isDownForMaintenance
. Es ist für die Arbeit des Arbeitnehmers notwendig, da es den aktuellen Stand des Antrags bestimmt.
<?php namespace YourApp; use Illuminate\Container\Container; class Application extends Container { public function isDownForMaintenance() { return false; } }
Als Nächstes müssen wir den illuminate/events
Anbieter registrieren und den Illuminate\Contracts\Events\Dispatcher
Vertrag an den events
Alias binden.
<?php use YourApp\Application; use Illuminate\Contracts\Events\Dispatcher; $application = Application::getInstance(); $application->bind(Dispatcher::class, 'events');
Jetzt müssen Sie die Capsule
Instanz erstellen und die Verbindungskonfigurationen dort hinzufügen.
Beispielkonfiguration für die Datenbank
<?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');
Konfigurationsbeispiel für Redis ( 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();
Der letzte Schritt in der Konfiguration ist das Hinzufügen eines analogen Ausnahmehandlers .
<?php use Illuminate\Contracts\Debug\ExceptionHandler; class Handler implements ExceptionHandler { public function report(Exception $e) {
Warteschlangenkonfiguration abgeschlossen. Jetzt können Sie mit dem Schreiben von 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);
php worker.php
nun einen Queue-Worker zu starten, schreiben php worker.php
einfach php worker.php
.
Wenn Sie queue:listen
, müssen Sie zwei separate Dateien erstellen. Einer ist ein Daemon, der die Warteschlange überwacht und bei jedem neuen Job eine zweite Datei ausführt. Die zweite Datei fungiert wiederum als Ausführender der Aufgabe.
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);
Wir übergeben zu verwenden. Alle Methoden können in der API angezeigt werden .
<?php use Illuminate\Queue\Capsule\Manager; Manager::push(SomeJob::class);