2017-01-30 3 views
0

Я использую очередь Laravel 5.4. Я хотел бы прочитать Excel и сделать запись БД этих записей через несколько секунд.Как передать функцию в очереди в Laravel 5.4?

$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'; 
} 

ответ

0

Я думаю, что вы действительно хотите сделать, это процесс первенствовать асинхронно, и вы можете написать класс задания, чтобы сделать то же самое. Класс задания может быть отправлен из функции контроллера и будет работать в фоновом режиме.

Пример работы одного и того же функциональность будет выглядеть так:

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); 
} 

И что нужно сделать, это для вас ,

Смежные вопросы