Files
site/nova/src/Actions/CallQueuedAction.php
2025-04-21 16:03:20 +02:00

95 lines
2.3 KiB
PHP

<?php
namespace Laravel\Nova\Actions;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Laravel\Nova\Fields\ActionFields;
use Laravel\Nova\Nova;
class CallQueuedAction
{
use CallsQueuedActions;
/**
* The Eloquent model/data collection.
*
* @var \Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection
*/
public $models;
/**
* Create a new job instance.
*
* @param \Laravel\Nova\Actions\Action $action
* @param string $method
* @param \Laravel\Nova\Fields\ActionFields $fields
* @param \Illuminate\Support\Collection $models
* @param string $batchId
* @return void
*/
public function __construct(Action $action, $method, ActionFields $fields, Collection $models, $batchId)
{
$this->action = $action;
$this->method = $method;
$this->fields = $fields;
$this->models = $models;
$this->batchId = $batchId;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
return $this->callAction(function ($action) {
return $action->withBatchId($this->batchId)->{$this->method}($this->fields, $this->models);
});
}
/**
* Call the failed method on the job instance.
*
* @param \Exception $e
* @return void
*/
public function failed($e)
{
Nova::actionEvent()->markBatchAsFailed($this->batchId, $e);
if ($method = $this->failedMethodName()) {
call_user_func([$this->action, $method], $this->fields, $this->models, $e);
}
}
/**
* Get the name of the "failed" method that should be called for the action.
*
* @return string|null
*/
protected function failedMethodName()
{
if (($method = $this->failedMethodForModel()) &&
method_exists($this->action, $method)) {
return $method;
}
return method_exists($this->action, 'failed')
? 'failed' : null;
}
/**
* Get the appropriate "failed" method name for the action's model type.
*
* @return string|null
*/
protected function failedMethodForModel()
{
if ($this->models->isNotEmpty()) {
return 'failedFor'.Str::plural(class_basename($this->models->first()));
}
}
}