قسّم Laravel إلى مكونات

مرحبا يا هبر. حصلت مؤخرًا على مشروع مثير للاهتمام بين يدي ، والذي على الرغم من بساطته ، طالب بعدم استخدام أي إطار. لم يكن هناك أي حديث عن الحزم ، لذلك تقرر استخدام مكونات 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')) { /** * 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); } } 

القيام به. يمكنك محاولة استخدام المساعد.


 <?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' => '', ]); //        Capsule. $manager->setAsGlobal(); 

يمكنك البدء باستخدام أداة إنشاء الاستعلام.


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

مثال تكوين لـ 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) { // ,  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; }); 

اكتمال تكوين قائمة الانتظار. الآن يمكنك البدء في كتابة 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; //  ,   " ",  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); 

نمر للاستخدام. يمكن الاطلاع على جميع الطرق في API.


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

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


All Articles