مرحبا يا هبر. حصلت مؤخرًا على مشروع مثير للاهتمام بين يدي ، والذي على الرغم من بساطته ، طالب بعدم استخدام أي إطار. لم يكن هناك أي حديث عن الحزم ، لذلك تقرر استخدام مكونات Laravel المعتادة. إذا كنت بحاجة إلى استخدام طوابير ، Eloquent أو حاوية - مرحبًا بك في cat.
على بساطة تقسيم الإطار إلى مكونات
بدءًا من Laravel 4 ، جميع المكونات عبارة عن حزم منفصلة ، والتي يمكن نظريًا تشغيلها في أي مشروع PHP. ومع ذلك ، تتطلب بعض المكونات تخصيصًا إضافيًا ، حيث يتم إخفاءه في الإطار الرئيسي أسفل الغطاء.
المكونات
حاوية
من بين جميع المكونات قيد النظر ، تعتبر illuminate/container
هي الأسهل في التثبيت والاستخدام.
<?php use Illuminate\Container\Container; $container = Container::getInstance(); return $container->make(Foo::class);
ومع ذلك ، فإن استدعاء طريقة ثابتة في فئة Container
كل مرة تستخدم فيها حاوية ليست فكرة جيدة. يتوفر app()
في الإطار ، مما سيعيد إصدار الحاوية العالمية إلينا ، ومع ذلك ، نحتاج إلى إنشاء واحد يدويًا.
قم helpers.php
ملف helpers.php
لهؤلاء المساعدين ، helpers.php
إلى بدء التشغيل.
"autoload": { "files": [ "src/helpers.php" ], "psr-4": { "YourApp\\": "src/" } }
أضف مساعد 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); } }
القيام به. يمكنك محاولة استخدام المساعد.
<?php return app(Foo::class);
منشئ الاستعلام و Eloquent
لاستخدام مكون illuminate/database
، سنستخدم Capsule\Manager
، فئة مصممة للعمل مع أداة إنشاء الاستعلام خارج Laravel.
لنبدأ بإنشاء اتصال بقاعدة البيانات. يُنصح بإجراء هذا التكوين في مرحلة بدء تشغيل التطبيق ، مباشرة بعد الاتصال 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' => '', ]);
يمكنك البدء باستخدام أداة إنشاء الاستعلام.
<?php use Illuminate\Database\Capsule\Manager; return Manager::table('orders')->get();
ماذا عن الفصيح؟
<?php namespace YourApp\Models; use Illuminate\Database\Eloquent\Model; class Order extends Model { protected $fillable = [ 'name', ]; }
<?php use YourApp\Models\Order; Order::first();
الموقف أكثر تعقيدًا مع الهجرات - فمن ناحية ، يوجد مخطط منشئ في المجموعة. من ناحية أخرى ، لا توجد آلية تلقائية لبدء عمليات الترحيل.
<?php use Illuminate\Database\Capsule\Manager; Manager::schema()->create('orders', function ($table) { $table->bigIncrements('id'); $table->string('name'); $table->timestamps(); });
للبدء ، فقط قم بتنفيذ الملف مع الترحيل: php migration.php
طوابير
تحتوي قوائم الانتظار أيضًا على Capsule
خاصة بها ، ومع ذلك ، فإن نظائر queue:work
وقائمة queue:listen
يجب كتابة queue:listen
يدويًا.
لنبدأ مع فئة Application
. في Laravel ، يتم استخدام هذه الفئة كحاوية حاوية عالمية ، والتي ، بالإضافة إلى أساليب Illuminate\Container\Container
، تحتوي على طرق مساعدة للعمل مع الإطار (الإصدار الحالي ومسارات التخزين والموارد). ومع ذلك ، فإن صفنا يحتوي على طريقة واحدة فقط - isDownForMaintenance
. إنه ضروري لعمل العامل ، لأنه يحدد حالة التطبيق في الوقت الحالي.
<?php namespace YourApp; use Illuminate\Container\Container; class Application extends Container { public function isDownForMaintenance() { return false; } }
بعد ذلك ، نحتاج إلى تسجيل موفر illuminate/events
، وربط عقد Illuminate\Contracts\Events\Dispatcher
المستعارة events
.
<?php use YourApp\Application; use Illuminate\Contracts\Events\Dispatcher; $application = Application::getInstance(); $application->bind(Dispatcher::class, 'events');
أنت الآن بحاجة إلى إنشاء مثيل Capsule
وإضافة تكوينات الاتصال هناك.
مثال التكوين لقاعدة البيانات
<?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/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();
الخطوة الأخيرة في التكوين هي إضافة معالج استثناء تمثيلي.
<?php use Illuminate\Contracts\Debug\ExceptionHandler; class Handler implements ExceptionHandler { public function report(Exception $e) {
اكتمال تكوين قائمة الانتظار. الآن يمكنك البدء في كتابة 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
.
إذا كانت هناك حاجة لاستخدام queue:listen
، فأنت بحاجة إلى إنشاء ملفين منفصلين. أحدها عبارة عن برنامج خفي يستمع إلى قائمة الانتظار ويدير ملفًا ثانيًا في كل وظيفة جديدة. الملف الثاني ، بدوره ، بمثابة المنفذ للمهمة.
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);
نمر للاستخدام. يمكن الاطلاع على جميع الطرق في API.
<?php use Illuminate\Queue\Capsule\Manager; Manager::push(SomeJob::class);