yousef-aman/prevent-deletion

防止删除具有相关记录的模型包。

v1.0.0 2024-05-19 18:17 UTC

This package is auto-updated.

Last update: 2024-09-19 19:02:33 UTC


README

一个用于防止删除具有相关记录的模型的Laravel包。

安装

方法 1:通过 Packagist 安装

  1. 运行以下命令以要求包

    composer require yousef-aman/prevent-deletion

方法 2:通过 GitHub 安装

  1. 将以下存储库添加到您的 composer.json 文件中

    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/yousef-aman/prevent-deletion.git"
        }
    ]
  2. 运行以下命令以要求包

    composer require yousef-aman/prevent-deletion

用法

步骤 1:在您的模型中使用特性

在您的模型中使用 PreventDeletionIfHasRelations 特性。定义任何特定条件,并且可选地,指定要排除或包含在检查中的关系。

示例:用户模型

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use YousefAman\PreventDeletion\Traits\PreventDeletionIfHasRelations;

class User extends Model
{
    use PreventDeletionIfHasRelations;

    // Exclude 'comments' from the check
    protected $excludedRelations = ['comments'];

    public function blogs()
    {
        return $this->hasMany(Blog::class);
    }

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    public function likes()
    {
        return $this->hasMany(Like::class);
    }

    // Define specific conditions dynamically
    public function specificConditions(): array
    {
        return [
            [
                'condition' => $this->is_active === false,
                'message' => 'Cannot delete this user because it is not active.'
            ],
            [
                'condition' => $this->is_verified === false,
                'message' => 'Cannot delete this user because it is not verified.'
            ]
        ];
    }

    // Optional: Customize deletion message
    public function getDeletionMessage($default)
    {
        return 'Custom deletion message: ' . $default;
    }
}

示例:博客模型

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use YousefAman\PreventDeletion\Traits\PreventDeletionIfHasRelations;

class Blog extends Model
{
    use PreventDeletionIfHasRelations;

    // No exclusions in this example
    protected $excludedRelations = [];

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    // Define specific conditions dynamically
    public function specificConditions(): array
    {
        return [
            [
                'condition' => $this->is_published === false,
                'message' => 'Cannot delete this blog because it is not published.'
            ]
        ];
    }

    // Optional: Customize deletion message
    public function getDeletionMessage($default)
    {
        return 'Custom deletion message: ' . $default;
    }
}

步骤 2:在控制器中处理删除

在您的控制器中处理异常,以提供友好的用户消息

namespace App\Http\Controllers;

use App\Models\User;
use YousefAman\PreventDeletion\Exceptions\PreventDeletionException;
use Exception;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function destroy($id)
    {
        try {
            $user = User::findOrFail($id);
            $user->delete();
            return redirect()->back()->with('success', 'User deleted successfully.');
        } catch (PreventDeletionException $e) {
            // Handle deletion prevention specifically
            return redirect()->back()->with('error', $e->getMessage());
        } catch (Exception $e) {
            // Handle other exceptions
            return redirect()->back()->with('error', 'An error occurred: ' . $e->getMessage());
        }
    }
}

功能

1. 自定义异常处理

该包使用自定义的 PreventDeletionException 类来处理与删除防止相关的异常。这使得捕获和处理这些异常与其他类型异常分开变得更容易。

namespace YousefAman\PreventDeletion\Exceptions;

use Exception;

class PreventDeletionException extends Exception
{
    /**
     * Create a new PreventDeletionException instance.
     *
     * @param  string  $message
     * @param  int  $code
     * @param  \Exception|null  $previous
     * @return void
     */
    public function __construct($message = "", $code = 0, Exception $previous = null)
    {
        parent::__construct($message, $code, $previous);
    }
}

2. 日志记录

该包集成了日志记录,以记录尝试删除具有相关记录的模型。这有助于调试和监控。

3. 可配置的消息

模型可以定义删除防止场景的自定义消息,使该包更加灵活。

public function getDeletionMessage($default)
{
    return $this->deletionMessage ?? $default;
}

4. 扩展配置

该包允许通过指定 excludedRelationsincludedRelations 来详细控制哪些关系被检查。

贡献

感谢您考虑为这个包做出贡献!您可以通过打开一个问题或提交一个拉取请求来贡献。

许可

此包是开源软件,受MIT许可许可。