Teilen Sie Laravel in Komponenten

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')) { /** * Get the available container instance. * * @param string|null $abstract * @param array $parameters * @return mixed|\Illuminate\Container\Container */ 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' => '', ]); //        Capsule. $manager->setAsGlobal(); 

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'); // ,    Illuminate\Database\Capsule\Manager       $queue->setAsGlobal(); $connection = Capsule::schema()->getConnection(); $resolver = new ConnectionResolver(['default' => $connection]); $queue->getQueueManager()->addConnector('database', function () use ($resolver) { return new DatabaseConnector($resolver); }); 

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) { // ,  Exception     . // :   Sentry,    . } public function render($request, Exception $e) { //   } public function renderForConsole($output, Exception $e) { //  ,     -  } public function shouldReport(\Exception $e) { //      } } app()->bind('exception.handler', function () { return new Handler; }); 

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; //  ,   " ",  Laravel  artisan,        work.php. // https://github.com/laravel/framework/blob/6.x/src/Illuminate/Queue/Listener.php#L72 define('ARTISAN_BINARY', 'work.php'); $worker = app(Listener::class, ['commandPath' => __DIR__]); $worker->setOutputHandler(function ($type, $line) { echo $line; }); $worker->listen('default', 'default', new 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); 

Source: https://habr.com/ru/post/de475144/


All Articles