to your account
list($rules, $input) = $this->hydrateFiles(Arr::get($input, $this->column, []));
use Encore\Admin\Form\Field\MultipleFile;
use Illuminate\Support\Arr;
class CustomMultipleFile extends MultipleFile
protected $view = 'admin::form.multiplefile';
* Related model sort column
* @var string
protected $sortColumn;
public function getValidator(array $input)
if (request()->has(static::FILE_SORT_FLAG)) {
return false;
return parent::getValidator($input);
public function sortable($sortColumn = 'sort')
$this->sortColumn = $sortColumn;
return parent::sortable();
protected function sortFiles($order)
$order = explode(',', $order);
$new = [];
$original = $this->original();
$relatedKeyName = $this->getRelatedKeyName();
if ($relatedKeyName) {
foreach ($order as $sort => $item) {
$newItem = Arr::first($original,
function ($originalItem) use ($item, $relatedKeyName) {
return $originalItem[$relatedKeyName] == $item;
if (!isset($newItem[$this->pathColumn])) {
continue;
$newItem[$this->sortColumn] = $sort;
$new[] = $newItem;
} else {
foreach ($order as $item) {
$new[] = Arr::get($original, $item);
return $new;
public function prepare($files)
$prepare = parent::prepare($files);
$sortColumn = $this->sortColumn;
if (!$sortColumn) {
return $prepare;
} else {
$sortStart = array_reduce($this->original(), function ($carry, $item) {
$sortVal = $item[$this->sortColumn] ?? 0;
return $carry > $sortVal ? $carry : $sortVal;
}, 0);
foreach ($prepare as &$file) {
if (!isset($file[$sortColumn])) {
$file[$sortColumn] = ++$sortStart;
return $prepare;
创建多图片扩展
use Encore\Admin\Form\Field\ImageField;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class CustomMultipleImage extends CustomMultipleFile
use ImageField;
* {@inheritdoc}
protected $view = 'admin::form.multiplefile';
* Validation rules.
* @var string
protected $rules = 'image';
* Prepare for each file.
* @param UploadedFile $image
* @return mixed|string
protected function prepareForeach(UploadedFile $image = null)
$this->name = $this->getStoreName($image);
$this->callInterventionMethods($image->getRealPath());
/* return tap($this->upload($image), function () {
$this->name = null;
}); */
/* Copied from single image prepare section and made necessary changes so the return
value is same as before, but now thumbnails are saved to the disk as well. */
$path = $this->upload($image);
$this->uploadAndDeleteOriginalThumbnail($image);
$this->name = null;
return $path;
在使用多文件的模型上获取文件关联时按照 sortColumn
进行排序
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Model
protected $fillable = [
'name',
'description'
public function images()
return $this->morphMany(Media::class, 'attachable')->orderBy('sort');
将自定义的多文件扩展注册到表单字段中, 使用即可
list($rules, $input) = $this->hydrateFiles(Arr::get($input, $this->column, []));
多图片排序的时候
hydrateFiles 的参数是 array 但是给的确是 string 如: '1,0'
解决方法:
if (request()->has(static::FILE_SORT_FLAG)) {
return false;
此方案会导致获取不到图片的验证规则
解决办法:
src/Form/Field/MultipleFile.php 79行 改为
$value = Arr::get($input, $this->column, []);
if (is_string($value)) $value = [];
list($rules, $input) = $this->hydrateFiles($value);
提示:排序时不能上传新图片