yousef-aman / prevent-deletion
防止删除具有相关记录的模型包。
v1.0.0
2024-05-19 18:17 UTC
README
一个用于防止删除具有相关记录的模型的Laravel包。
安装
方法 1:通过 Packagist 安装
-
运行以下命令以要求包
composer require yousef-aman/prevent-deletion
方法 2:通过 GitHub 安装
-
将以下存储库添加到您的
composer.json
文件中"repositories": [ { "type": "vcs", "url": "https://github.com/yousef-aman/prevent-deletion.git" } ]
-
运行以下命令以要求包
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. 扩展配置
该包允许通过指定 excludedRelations
和 includedRelations
来详细控制哪些关系被检查。
贡献
感谢您考虑为这个包做出贡献!您可以通过打开一个问题或提交一个拉取请求来贡献。
许可
此包是开源软件,受MIT许可许可。