【问题标题】:Laravel Nova + Spatie Media libraryLaravel Nova + Spatie 媒体库
【发布时间】:2019-02-01 08:21:24
【问题描述】:

尝试将 Laravel Nova 与 Spatie 媒体库一起使用。我创建了这样的上传字段:

Image::make('Logo')
        ->store(function (Request $request, $model) {
            $model->addMediaFromRequest('logo')->toMediaCollection('manufacturers');
        }),

接缝正常,但 Nova 仍在尝试将文件名保存到制造商表中的“徽标”列。

自定义此字段的原始示例是:

File::make('Attachment')
    ->store(function (Request $request, $model) {
        return [
            'attachment' => $request->attachment->store('/', 's3'),
            'attachment_name' => $request->attachment->getClientOriginalName(),
            'attachment_size' => $request->attachment->getSize(),
        ];
    })

【问题讨论】:

    标签: laravel laravel-5 laravel-nova laravel-medialibrary


    【解决方案1】:

    与 Nova 3(和 Laravel 8)一样,您需要从 fillUsingstore 方法返回 true

    File::make('Attachment')
        ->store(function (Request $request, $model) {
            $model->addMediaFromRequest('logo')->toMediaCollection('manufacturers');
    
            return true;
            // This will tell nova that you have taken care of it yourself.
        })
    

    只要您返回除true 之外的任何内容,nova 就会假定它需要将某些内容保存到数据库中。如果 db 中不存在该字段(与 spatie-medialibrary 一样),这会导致错误,或者如果该字段存在但用于其他目的,它将覆盖您的宝贵数据。

    【讨论】:

      【解决方案2】:

      Nova 允许您从回调中返回 true 以指示处理已完成并且它本身不应设置任何属性。

      这是运行回调的代码:

      protected function fillAttribute(NovaRequest $request, $requestAttribute, $model, $attribute)
      {
          //...
      
          $result = call_user_func($this->storageCallback, $request, $model);
      
          if ($result === true) {
              return;
          }
      
          if (! is_array($result)) {
              return $model->{$attribute} = $result;
          }
      
          foreach ($result as $key => $value) {
              $model->{$key} = $value;
          }
      }
      

      所以true 或任何空数组都可以实现相同的效果,但个人感觉前者更清晰。

      【讨论】:

        【解决方案3】:
            Image::make('Logo')
                ->store(function (Request $request, $model) {
                    $model->addMediaFromRequest('logo')->toMediaCollection('manufacturers');
                return [];
                }),
        

        可能返回一个空数组会阻止 nova 保存名称。

        【讨论】:

          【解决方案4】:

          我通过在模型上设置一个空的 mutator 找到了解决方法。在您的情况下,它将是:

          class Manufacturer extends Model implements HasMedia
          {
              use HasMediaTrait;
          
              public function setLogoAttribute() {}
          
              //...
          }
          

          这是我的整个实现的示例。请注意,目前在 Nova 1.0.6 中,preview() 方法不起作用,它正在返回 thumbnail() url。

          应用/图库项目

          class GalleryItem extends Model implements HasMedia
          {
              use HasMediaTrait;
          
              public function setImageAttribute() {}
          
              public function registerMediaConversions(Media $media = null)
              {
                  $this->addMediaConversion('thumbnail')
                      ->fit(Manipulations::FIT_CROP, 64, 64);
          
                  $this->addMediaConversion('preview')
                      ->fit(Manipulations::FIT_CROP, 636, 424);
          
                  $this->addMediaConversion('large')
                      ->fit(Manipulations::FIT_CONTAIN, 1920, 1080)
                      ->withResponsiveImages();
              }
          
              public function registerMediaCollections()
              {
                  $this->addMediaCollection('images')->singleFile();
              }
          }
          

          App/Nova/GalleryItem

          class GalleryItem extends Resource
          {
              public static $model = 'App\GalleryItem';
          
              public static $with = ['media'];
          
              public function fields(Request $request)
              {
                  return [
                      Image::make('Image')
                          ->store(function (Request $request, $model) {
                              $model->addMediaFromRequest('image')->toMediaCollection('images');
                          })
                          ->preview(function () {
                              return $this->getFirstMediaUrl('images', 'preview');
                          })
                          ->thumbnail(function () {
                              return $this->getFirstMediaUrl('images', 'thumbnail');
                          })
                          ->deletable(false);
                  ];
              }
          }
          

          【讨论】:

          • 为什么使用这些代码下载链接消失了?
          猜你喜欢
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 2020-06-14
          • 2022-07-07
          • 1970-01-01
          • 2021-07-12
          • 1970-01-01
          • 2021-03-03
          相关资源
          最近更新 更多