如何在Laravel 5.4中传递队列中的功能?

时间:2017-01-30 11:02:21

标签: php laravel queue laravel-queue

我正在使用Laravel 5.4队列。我想阅读Excel并在几秒钟后输入该记录的数据库。

$queue = Queue::later(10,'LogMsg', app('App\Http\Controllers\getFileController')->myfunc($name));
 return $queue;

这是我的通话功能,首先我可以这样通过吗?

public function myfunc($name)  {
    $f_data = Excel::load('public/invoices/'.$name, function($reader) {
        })->get();     
    if(!empty($f_data) && $f_data->count()){
           foreach ($f_data as $key => $row){                          
                  $inv = new final_tables;
                  foreach ($row as $key1 => $col){
                        $inv->$key1 = $row->$key1;
                  }
                  $inv->save();
           }
      }
     return 'done';
}

1 个答案:

答案 0 :(得分:0)

我认为你真正想做的是异步处理excel,你可以写一个工作类来做同样的事情。可以从控制器功能调度作业类,并在后台运行。

具有相同功能的示例作业如下所示:

class ReadExcelAndSaveRecordsToDB implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $filePath;

    /**
    * Create a new job instance.
    *
    * @return void
    */
   public function __construct(string $filePath)
   {
       $this->filePath = $filePath;
   }

   /**
    * Execute the job.
    *
    * @return void
    */
    public function handle()
    {
        $fileData = Excel::load($this->filePath, function($reader) {
        })->get();

        //Whatever you want to do with the file here, for eg. create a DB entry
        return 'done';
    }
}

现在您可以从控制器功能调度相同的作业,如下所示:

use Carbon\Carbon;


public function someControllerAction(Request $request)
{
    $filePath = //Save file and obtain filepath

    $job = (new ReadExcelAndSaveRecordsToDB($filePath))
                ->delay(Carbon::now()->addMinutes(10));

    dispatch($job);
}

那应该为你做。