哈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')) { 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' => '', ]);
您可以开始使用查询构建器。
<?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:work
和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');
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) {
队列配置完成。 现在您可以开始编写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);