Bagilah Laravel menjadi beberapa komponen

Hai, Habr. Baru-baru ini saya mendapatkan proyek yang menarik, yang, meskipun sederhana, menuntut untuk tidak menggunakan kerangka kerja apa pun. Tidak ada pembicaraan tentang paket, jadi diputuskan untuk menggunakan komponen Laravel yang biasa. Jika Anda perlu menggunakan antrian, Eloquent atau wadah - selamat datang di kucing.


Pada kesederhanaan membagi kerangka kerja menjadi komponen


Dimulai dengan Laravel 4, semua komponen adalah paket terpisah, yang secara teori dapat dibuat untuk bekerja dalam proyek PHP apa pun. Namun, beberapa komponen memerlukan penyesuaian tambahan, yang dalam kerangka utama disembunyikan di bawah tenda.


Komponen


Wadah


Dari semua komponen yang dipertimbangkan, illuminate/container adalah yang termudah untuk diinstal dan digunakan.


 <?php use Illuminate\Container\Container; $container = Container::getInstance(); return $container->make(Foo::class); 

Namun, memanggil metode statis pada kelas Container setiap kali Anda menggunakan sebuah wadah bukanlah ide yang baik. app() tersedia dalam kerangka kerja, yang akan mengembalikan instance kontainer global kepada kami, namun, kami perlu membuat satu secara manual.


Buat file helpers.php untuk helpers tersebut, dan tambahkan ke startup.


 "autoload": { "files": [ "src/helpers.php" ], "psr-4": { "YourApp\\": "src/" } } 

Tambahkan pembantu app() ke file.


 <?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); } } 

Selesai Anda dapat mencoba menggunakan pembantu.


 <?php return app(Foo::class); 

Pembuat Kueri dan Eloquent


Untuk menggunakan komponen illuminate/database , kami akan menggunakan Capsule\Manager , kelas yang dirancang untuk bekerja dengan pembuat kueri di luar Laravel.


Mari kita mulai dengan mengatur koneksi ke database. Dianjurkan untuk melakukan konfigurasi ini pada tahap permulaan aplikasi Anda, segera setelah menghubungkan 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(); 

Anda bisa memulai dengan pembuat kueri.


 <?php use Illuminate\Database\Capsule\Manager; return Manager::table('orders')->get(); 

Bagaimana dengan Eloquent?


 <?php namespace YourApp\Models; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $fillable = [ 'name', ]; } 

 <?php use YourApp\Models\Order; Order::first(); 

Situasinya lebih rumit dengan migrasi - di satu sisi, ada Pembuat Skema dalam kit. Di sisi lain, tidak ada mekanisme otomatis untuk memulai migrasi.


 <?php use Illuminate\Database\Capsule\Manager; Manager::schema()->create('orders', function ($table) { $table->bigIncrements('id'); $table->string('name'); $table->timestamps(); }); 

Untuk memulai, cukup jalankan file dengan migrasi: php migration.php


Antrian


Antrian juga memiliki Capsule sendiri, namun analog dari queue:work dan queue:listen harus ditulis secara manual.


Mari kita mulai dengan kelas Application . Di Laravel, kelas ini digunakan sebagai instance kontainer global, yang, selain metode Illuminate\Container\Container , berisi metode bantu untuk bekerja dengan kerangka kerja (versi saat ini, jalur penyimpanan, sumber daya). Namun, kelas kami hanya akan berisi satu metode - isDownForMaintenance . Ini diperlukan untuk pekerjaan pekerja, karena menentukan keadaan aplikasi saat ini.


 <?php namespace YourApp; use Illuminate\Container\Container; class Application extends Container { public function isDownForMaintenance() { return false; } } 

Selanjutnya, kita perlu mendaftarkan penyedia illuminate/events , dan mengikat Illuminate\Contracts\Events\Dispatcher ke alias events .


 <?php use YourApp\Application; use Illuminate\Contracts\Events\Dispatcher; $application = Application::getInstance(); $application->bind(Dispatcher::class, 'events'); 

Sekarang Anda perlu membuat instance Capsule , dan menambahkan konfigurasi koneksi di sana.


Contoh konfigurasi untuk database


 <?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); }); 

Contoh konfigurasi untuk Redis (memerlukan 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(); 

Langkah terakhir dalam konfigurasi adalah menambahkan Pengecualian Analog.


 <?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; }); 

Konfigurasi antrian selesai. Sekarang Anda dapat mulai menulis 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); 

Sekarang untuk memulai pekerja antrian, cukup tulis php worker.php .


Jika perlu menggunakan queue:listen , maka Anda perlu membuat dua file terpisah. Salah satunya adalah daemon yang mendengarkan antrian dan menjalankan file kedua di setiap pekerjaan baru. File kedua, pada gilirannya, bertindak sebagai pelaksana tugas.


pekerja.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); 

Kami lulus untuk digunakan. Semua metode dapat dilihat di API.


 <?php use Illuminate\Queue\Capsule\Manager; Manager::push(SomeJob::class); 

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


All Articles