class DataFormFields extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $fieldList = [
'name' => 'Tom',
'age' => '20',
];
public function handle()
{
$fields = $this->fieldList;
return $fields;
}
}
public function create()
{
$data = $this->dispatch(new DataFormFields());
return view('create', $data);
}
我尝试dd($ data);打印0
代码可以在laravel5.1中运行,但是在5.2中它不是ok.help
答案 0 :(得分:1)
Laravel5.2该类将实现Illuminate\Contracts\Queue\ShouldQueue
接口,向Laravel指示作业应该被推送到队列而不是同步运行。
所以你应该像php artisan make:job fooJob --sync
答案 1 :(得分:0)
我不认为您希望依赖dispatch()的返回,因为排队的作业可以将执行延迟一段任意时间,具体取决于您的实现。您可能想要考虑使用事件或回调。
https://laravel.com/docs/5.2/queues#job-events
或者,在句柄功能结束时,您可以执行以下操作:
call_user_func(['FormFieldsHandler', 'dataFormFieldsCallback'], $data]);
答案 2 :(得分:0)
获取这样的字段列表并不是Job的用例,因为handle()
方法的返回值永远不会通过dispatch()
方法返回到调用范围。 / p>
这似乎是最好留给服务或模型的东西。
以下是使用服务实现此目的的方法。
<?php
namespace App\Services;
class DataFieldService
{
protected $fields = ['field_one', 'field_two'];
public function getFields()
{
return $this->fields;
}
}
在控制器......
<?php
namespace App\Http\Controllers;
use App\Services\DataFieldService;
class MyController
{
// in Laravel, the IoC container will inject DataFieldService
// for you automagically if you type hint it
public function create(DataFieldService $dataFieldService)
{
$fields = $dataFieldService->getFields();
return view('create', compact('fields'));
}
}
显然,您可以充实DataFieldService以从数据库或其他东西获取字段。希望有所帮助!
答案 3 :(得分:0)
是的,你可以。只需返回值即可。您可以像这样调用作业的句柄,而不是调用调度。
public function handle()
{
$a = "return value";
return $a;
}
}
现在,而不是在控制器中调用$this->dispatch(new ExampleJob)
。你可以这样做。
$exampleJob = new ExampleJob();
$retval = $exampleJob->handle();
echo $retval; //return value
请注意,只有在您不打算将作业排队时才有效。
答案 4 :(得分:0)
您无法从异步作业获得结果。当您从ShouldQueue接口实现时,这意味着您倾向于执行作业Async。您必须删除ShouldQueue才能执行同步作业以获得结果