[Intermediate Laravel] 11-Dispatching-Jobs

php中文网
发布: 2016-06-20 12:29:28
原创
1488人浏览过

简介

之前我们已经学习了 events 和 listeners ,这次我们来学习 jobs。

Jobs的创建

运行命令行 php artisan make:job CompileReports 创建一个Job类,Job类的结构简单,一般来说只会包含一个让队列用来调用此任务的 handle 方法,具体代码如下:

class CompileReports extends Job implements SelfHandling{   /**   * Create a new job instance.   *   * @return void   */  public function __construct()  {    //  }   /**   * Execute the job.   *   * @return void   */  public function handle()  {    //  }} 
登录后复制

可以通过 php artisan help make:job 观察相关参数,执行 php artisan make:job CompileReports --queued ,对比发现和之前类区别为多实现了 ShouldQueue 接口,这意味着可以按队列顺序执行。

增加路由和控制器

默认路由 routes.php 中增加:

Route::get('reports', 'ReportsController@index'); 
登录后复制

通过执行命令行 php artisan make:controller ReportsController --plain ,创建 ReportsController 控制器,增加测试方法:

class ReportsController extends Controller{    //  public function index()  {    $job = new CompileReports();    $this->dispatch($job);    return 'Done';  } } 
登录后复制

ReportsController 控制器的 Controller 父类中,默认已经 use DispatchesJobs ,定义好了 dispatch($job) 方法,用来调度任务。这时我们访问页面效果如下图:

Job中参数处理

改写 CompileReports.php 代码,构造函数中接受 $reportId 参数:

class CompileReportsextends Jobimplements SelfHandling, ShouldQueue{   protected $reportId;  /**   * Create a new job instance.   *   * @return void   */  public function __construct($reportId)  {    //    $this->reportId = $reportId;  }   /**   * Execute the job.   *   * @return void   */  public function handle()  {    //    var_dump('Compiling the reports with the id '. $this->reportId .' within the Job class.');  }} 
登录后复制

ReportsController 控制器中接受请求中参数,转发给Job处理:

class ReportsController extends Controller{  public function index(Request $request)  {    $job = new CompileReports($request->input('reportId'));    $this->dispatch($job);    return 'Done';  }} 
登录后复制

灵感PPT
灵感PPT

AI灵感PPT - 免费一键PPT生成工具

灵感PPT 226
查看详情 灵感PPT

访问页面效果如下:

Job中多参数处理

ReportsController 中改为调用 dispatchFrom 方法:

class ReportsController extends Controller{    //  public function index(Request $request)  {    //$job = new CompileReports($request->input('reportId'));        // $this->dispatchFrom(CompileReports::class, $request);    $this->dispatchFrom('App\Jobs\CompileReports', $request);    return 'Done';  } } 
登录后复制

其中 DispatchesJobs 中定义了 dispatch 及 dispatchFrom,如下:

trait DispatchesJobs{    /**     * Dispatch a job to its appropriate handler.     *     * @param  mixed  $job     * @return mixed     */    protected function dispatch($job)    {        return app('Illuminate\Contracts\Bus\Dispatcher')->dispatch($job);    }     /**     * Marshal a job and dispatch it to its appropriate handler.     *     * @param  mixed  $job     * @param  array  $array     * @return mixed     */    protected function dispatchFromArray($job, array $array)    {        return app('Illuminate\Contracts\Bus\Dispatcher')->dispatchFromArray($job, $array);    }     /**     * Marshal a job and dispatch it to its appropriate handler.     * 整理参数列表,传递给job     * @param  mixed  $job     * @param  \ArrayAccess  $source     * @param  array  $extras     * @return mixed     */    protected function dispatchFrom($job, ArrayAccess $source, $extras = [])    {        return app('Illuminate\Contracts\Bus\Dispatcher')->dispatchFrom($job, $source, $extras);    }} 
登录后复制

CompileReports 类中改写传入参数:

class CompileReportsextends Jobimplements SelfHandling, ShouldQueue{   protected $reportId;   protected $type;  /**   * Create a new job instance.   *   * @return void   */  public function __construct($reportId, $type)  {    //    $this->reportId = $reportId;    $this->type = $type;  }   /**   * Execute the job.   *   * @return void   */  public function handle()  {    //    var_dump('Compiling the '. $this->type .' reports with the id '. $this->reportId .' within the Job class.');  }} 
登录后复制

访问效果如下图:

在 Job 中添加 DispatchesJobs 引用后,可继续分派Job:

/*** Execute the job.** @return void*/public function handle(){    // var_dump('Compiling the '. $this->type .' reports with the id '. $this->reportId .' within the Job class.');    var_dump(sprintf('Compiling the %s report with the id %s within the Job class', $this->type, $this->reportId));    // 增加 DispatchesJobs 引用后,可继续分派 job    if(true)    {        $this->dispatch(new DoSomethingElse);    }} 
登录后复制

访问效果如下图:

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号