avto-dev/roadrunner-laravel

此包已被弃用且不再维护。作者建议使用 spiral/roadrunner-laravel 包。

Laravel 应用程序的 RoadRunner 桥接器

v3.3.0 2020-05-13 07:49 UTC

README

68747470733a2f2f6769746875622e6769746875626173736574732e636f6d2f696d616765732f69636f6e732f656d6f6a692f756e69636f64652f323661302e706e67 此包已被弃用且不再维护 68747470733a2f2f6769746875622e6769746875626173736574732e636f6d2f696d616765732f69636f6e732f656d6f6a692f756e69636f64652f323661302e706e67
建议使用 spiral/roadrunner-laravel

RoadRunner ⇆ Laravel 桥接器

Version Version Build Status Coverage Downloads count License

轻松连接 RoadRunnerLaravel 应用程序的方法。

安装

使用以下命令使用 composer 安装此包

$ composer require avto-dev/roadrunner-laravel "^3.3"

需要安装 composer如何安装 composer)。

您需要修复包的主版本。

之前的主版本仍然可用,但其开发已被弃用。仅使用最新主版本!

之后,您可以使用以下命令“发布”包配置文件(./config/roadrunner.php

$ php ./artisan vendor:publish --provider='AvtoDev\RoadRunnerLaravel\ServiceProvider' --tag=config

和基本的 RoadRunner 配置文件(./.rr.yaml.dist

$ php ./artisan vendor:publish --provider='AvtoDev\RoadRunnerLaravel\ServiceProvider' --tag=rr-config

之后,您可以按需修改配置文件。

重要:尽管工作进程允许您在每次 HTTP 请求时刷新应用程序实例(如果环境变量 APP_REFRESH 设置为 true),但我们强烈建议出于性能原因避免此操作。大型应用程序可能难以与 RoadRunner 集成(您必须决定哪些服务提供商必须在每次请求时重新加载,避免在某些情况下的“静态优化”),但这是值得的。

使用方法

包安装后,您可以使用提供的“二进制”文件作为 RoadRunner 工作进程:./vendor/bin/rr-worker。此工作进程允许您使用 laravel 事件系统 与传入请求和传出响应进行交互。事件还包含

事件类名 应用程序对象 HTTP 服务器请求 HTTP 请求 HTTP 响应 异常
BeforeLoopStartedEvent
BeforeLoopIterationEvent
BeforeRequestHandlingEvent
AfterRequestHandlingEvent
AfterLoopIterationEvent
AfterLoopStoppedEvent
LoopErrorOccurredEvent

简单的 .rr.yaml 配置示例

env:
  #APP_REFRESH: true

http:
  address: 0.0.0.0:8080
  workers:
    command: 'php ./vendor/bin/rr-worker'

static:
  dir: 'public'

Roadrunner 服务器启动

$ rr -c ./.rr.yaml serve -d

监听器

此包提供事件监听器,用于在不完全重新加载应用程序的情况下重置应用程序状态(例如cookie、HTTP请求、应用程序实例、服务提供商等)。其中一些已在配置文件中声明,但您也可以无限制地声明自己的。

环境变量

您可以使用以下环境变量

变量名称 描述
APP_FORCE_HTTPS (在配置文件中声明) 强制应用程序使用HTTPS方案
APP_REFRESH 每次请求都刷新应用程序实例

已知问题

控制器构造函数

您应该避免使用HTTP控制器构造函数(在构造函数中创建或解析的实例可以在不同的请求之间共享)。请使用控制器中的依赖关系解析在方法中。

不好

<?php

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;
    
    /**
     * @var Request
     */
    protected $request;

    /**
     * @param UserRepository $users
     * @param Request        $request
     */
    public function __construct(UserRepository $users, Request $request)
    {
        $this->users   = $users;
        $this->request = $request;
    }
    
    /**
     * @return Response
     */
    public function store(): Response
    {
        $user = $this->users->getById($this->request->id);
        
        // ...
    }
}

<?php

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * @param  Request        $request
     * @param  UserRepository $users
     *
     * @return Response
     */
    public function store(Request $request, UserRepository $users): Response
    {
        $user = $users->getById($request->id);
        
        // ...
    }
}

中间件构造函数

您绝对不应该使用中间件构造函数来解析和存储在属性中的sessionsession.storeauth或认证Guard实例。请使用方法注入或通过Request实例访问它们。

不好

<?php

use Illuminate\Http\Request;
use Illuminate\Session\Store;

class Middleware
{
    /**
     * @var Store
     */
    protected $session;

    /**
     * @param Store $session
     */
    public function __construct(Store $session)
    {
        $this->session = $session;
    }
    
    /**
     * Handle an incoming request.
     *
     * @param Request  $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $name = $this->session->getName();
        
        // ...
        
        return $next($request);
    }
}

<?php

use Illuminate\Http\Request;

class Middleware
{
    /**
     * Handle an incoming request.
     *
     * @param Request  $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $name = $request->session()->getName();
        // $name = resolve('session')->getName();
        
        // ...
        
        return $next($request);
    }
}

测试

对于包的测试,我们使用phpunit框架和docker-ce + docker-compose作为开发环境。因此,在克隆存储库后,只需在终端中写入即可。

$ make build
$ make latest # or 'make lowest'
$ make test

变更日志

Release date Commits since latest release

变更日志可在此处找到

支持

Issues Issues

如果您发现任何包错误,请在当前存储库中创建一个问题

许可证

这是一个开源软件,根据MIT许可证许可。