将Laravel分为组件

哈Ha 最近,我手头有一个有趣的项目,尽管它很简单,但要求不要使用任何框架。 由于没有关于软件包的讨论,因此决定使用常规的Laravel组件。 如果您需要使用队列,Eloquent或容器,欢迎使用。


关于将框架分为组件的简单性


从Laravel 4开始,所有组件都是单独的软件包,从理论上讲,它可以在任何PHP项目中使用。 但是,某些组件需要额外的自定义,这些自定义在主框架中隐藏在内部。


组成部分


货柜


在考虑中的所有组件中, illuminate/container最容易安装和使用。


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

但是,每次使用容器时在Container类上调用静态方法不是一个好主意。 框架中提供了 app()器,该帮助器会将全局容器实例返回给我们,但是,我们需要手动创建一个。


为此类助手创建一个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); 

查询生成器和口才


要使用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(); 

迁移的情况更加复杂-一方面,套件中有一个Schema Builder。 另一方面,没有用于启动迁移的自动机制。


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

首先,只需执行迁移文件即可: php migration.php


Queue列


队列也有自己的Capsule ,但是queue:workqueue: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); }); 

Redis的配置示例(需要illuminate/redis 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/zh-CN475144/


All Articles