waad/media

将媒体添加到您的 Laravel 应用程序的一个地方

v3.0.2 2023-12-24 10:18 UTC

This package is auto-updated.

Last update: 2024-09-05 12:59:56 UTC


README

Logo

🔥 媒体文件包

一个包,可以将您的文件保存到多个磁盘和多个目录中,具有相同的模型

❤️ 作者

⚠️ 最小要求

* 版本 >= 2.0.0

  • PHP >= 8.0.0
  • Laravel 8, 9, 10

 

* 版本 < 2.0.0

  • PHP 7.4
  • Laravel 7, 8

💯 安装

要安装

composer require waad/media

首先 : 使用以下命令发布 config

php artisan vendor:publish --provider="Waad\Media\MediaServiceProvider" --tag="media-config"

确保从 config/media.php 中配置 uuidshortcut

⚠️ 清除缓存在发布迁移之前非常重要

php artisan optimize

其次 : 使用以下命令发布 migrations

php artisan vendor:publish --provider="Waad\Media\MediaServiceProvider" --tag="media-migrations"

您可以迁移

php artisan migrate

您可以通过从 config.media.shortcut 数组中指定磁盘来创建链接快捷方式

'shortcut' => [
        'public' => 'media',
        // disk => shortcut name
    ],
php artisan media:link

🧰 使用/示例

模型

<?php

namespace App\Models;

use Waad\Media\Traits\HasOneMedia;
// or
use Waad\Media\Traits\HasManyMedia;

class Post extends Model
{
    use HasOneMedia;       <<------ return one last record of media 
    // or
    use HasManyMedia;      <<------ return list of media


    // $media_disk
    // $media_directory 
    // if not define will get default `disk,directory`  in `config/media.php`
    public $media_disk = 'public';
    public $media_directory = 'posts/images';
    ......

 

您可以获取媒体

$post->media;

 

  • 上传文件 例如。在控制器 store 方法中使用,以添加一个或多个文件
$post = Post::create([
  ...........
]);

$files = $request->file('image'); // one image
$files = $request->file('images'); // many images

// version < 2 
// will return an array of file names
$media = $post->addMedia($files); 
$media = $post->addMedia($files, $index = 1, $label = 'cover'); 


// ***************************************************


// version >= 2 
// will return the Media model or array of Media models on the Relationship
$media = $post->addMedia($files)->upload();
$media = $post->addMedia($files)->label('cover')->index(3)->upload();
$media = $post->addMedia($files)->disk('public')->directory('posts/video')->label('cover')->index(3)->upload();


return $media;

 

  • 同步文件 例如。在控制器 update 方法中使用,以添加一个或多个文件
$post = Post::find(1);
$post->update([
  ...........
]);

$files = $request->file('image'); // one image
$files = $request->file('images'); // many images

// version < 2 
// will return an array of file names
$media = $post->syncMedia($files);
$media = $post->syncMedia($files, $index = 2);


// ***************************************************


// version >= 2 
// will return the Media model or array of Media Models on the Relationship
$media = $post->syncMedia($files)->sync();
$media = $post->syncMedia($files, $ids = [1,3])->sync(); // delete only these $ids and upload new files
$media = $post->syncMedia($files)->label('cover')->index(3)->sync();
$media = $post->syncMedia($files)->disk('public')->directory('posts/video')->label('cover')->index(3)->sync();

return $media;
  • 删除文件 例如。在控制器 destroy 方法中使用,以删除所有或特定 id
$post = Post::find(1);

// version < 2 
// will return an array of file names
$media = $post->deleteMedia($files);
$media = $post->deleteMedia($files, $index = 2);


// ***************************************************


// version >= 2 
// will return a bool or array of bool or null by on Relationship
$media = $post->deleteMedia()->delete();
$media = $post->deleteMedia($medias_model)->delete();
$media = $post->deleteMedia([1,3])->delete(); // delete only these ids

$lastMedia = $post->media->last(); // return Collection Media Model 
$media = $post->deleteMedia($lastMedia)->delete(); // delete only this media

$media2 = $post->mediaById(8);
$media = $post->deleteMedia($media2)->delete(); 

$mediaList = $post->mediaByMimeType('image/png');
$media = $post->deleteMedia($mediaList)->delete(); 

$post->delete();

 

  • 其他辅助 仅版本 >= 2
// get sum files size of post object (bytes)
$post->mediaTotalSize();

//**********************************************

// get count media of post object
$post->mediaTotalCount();

// get count media with soft delete of post object
$post->mediaTotalCount($withTrashed = true);  

//**********************************************

// get media by id of the post object
$post->mediaById(17);

// get media with soft delete by id of the post object
$post->mediaById(17, $withTrashed = true);    

//**********************************************

// get media by mime_type of post object
$post->mediaByMimeType('image/png');

// get media with soft delete by mime_type of the post object
$post->mediaByMimeType('image/png', $withTrashed = true);

//**********************************************

// get media by approved boolean of the post object
$post->mediaApproved();      // default true
$post->mediaApproved(false);

// get media with soft delete by approved boolean of the post object
$post->mediaApproved(false, $withTrashed = true);

 

  • 您可以更新对象的全部媒体的 approved
$post->media->approve();   // put approved = true

$post->media->disApprove();   // put approved = false

 

  • 您可以获取上传该媒体的用户
// if was HasOneMedia
1 - optional($post->media)->user;
2 - Post::with('media.user')->find(1);

//**********************************************

// if was HasManyMedia
1 - Post::with('media.user')->get();
2 - $post->media->load('user');

🎀 范围

您可以获取仅批准等于 true 的内容

$post->media->approved();  // approved = true

🍔 永久删除文件

config/media.php 中确定 delete_file_after_day 必须是整数

⭕️ 将命令添加到项目的 crontab 中以自动执行

app/Console/Kernel.php 中添加此命令

protected function schedule(Schedule $schedule)
    {
        // .....................

        $schedule->command('media:prune')->daily();
    }

⭕️ 手动实现

php artisan media:prune

🎯 许可证

MIT License

星标历史

Star History Chart