renatoxm / laravel-ticket
Laravel票务系统,帮助您轻松管理票务
Requires
- php: ^8.1
- illuminate/contracts: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.16.4
Requires (Dev)
- larastan/larastan: ^2.9.2
- laravel/pint: ^1.15
- nunomaduro/collision: ^7.0|^8.0
- orchestra/testbench: ^8.0|^9.0
- pestphp/pest: ^2.34
- pestphp/pest-plugin-laravel: ^2.3
- phpunit/phpunit: ^10.5
README
处理票务系统的后端API。
简介
Laravel Ticket 包,是一个处理票务系统的后端API,操作简便。它是从 CoderFlex Laravel-ticket 分支出来的,重构后允许模型更新,更加灵活以适应应用需求。
主要区别
- 所有模型都可以复制并修改以满足您的需求;您只需更改 config/laravel-ticket.php 中的路径。
- 票务可以通过多态多对多关系分配给用户模型、组或团队。
- 消息模型为了语义原因重命名为评论模型。
- 为票务和评论模型的变更状态提供了事件支持。
安装
您可以通过composer安装此包
composer require Renatoxm/laravel-ticket
配置
您可以使用以下命令发布配置文件
php artisan vendor:publish --tag="ticket-config"
您可以使用以下命令发布并运行迁移
php artisan vendor:publish --tag="ticket-migrations"
在运行迁移之前,您可能需要发布配置文件,并确保当前表不会与您的现有应用程序冲突,一旦您对迁移表满意,您可以运行
php artisan migrate
准备你的模型
将 HasTickets
特性添加到您的 User
模型中,同时包含 CanUseTickets
接口
... use Renatoxm\LaravelTicket\Concerns\HasTickets; use Renatoxm\LaravelTicket\Contracts\CanUseTickets; ... class User extends Model implements CanUseTickets { ... use HasTickets; ... }
模型定制
您可以将包中的模型之一或多个复制到您的 App/Models
文件夹中,以根据您的需求进行定制。您只需更改 config/laravel-ticket.php 中的类路径即可。
'model' => [ 'category' => Renatoxm\LaravelTicket\Models\Category::class, 'label' => Renatoxm\LaravelTicket\Models\Label::class, 'comment' => Renatoxm\LaravelTicket\Models\Comment::class, 'ticket' => Renatoxm\LaravelTicket\Models\Ticket::class, ],
用法
此包的基本用法是创建一个 ticket
,然后将 labels
和 categories
关联到它。
您可以将尽可能多的 categories
/labels
关联到单个票务。
以下是一个示例
use Renatoxm\LaravelTicket\Models\Ticket; use Renatoxm\LaravelTicket\Models\Category; use Renatoxm\LaravelTicket\Models\Label; ... public function store(Request $request) { /** @var User */ $user = Auth::user(); $ticket = $user->tickets() ->create($request->validated()); $category = Category::first(); $label = Label::first(); $ticket->attachCategories($category); $ticket->attachLabels($label); // or you can create the categories & the tickets directly by: // $ticket->categories()->create(...); // $ticket->labels()->create(...); return redirect(route('tickets.show', $ticket->uuid)) ->with('success', __('Your Ticket Was created successfully.')); } public function createLabel() { // If you create a label seperated from the ticket and wants to // associate it to a ticket, you may do the following. $label = Label::create(...); $label->tickets()->attach($ticket); // or maybe $label->tickets()->detach($ticket); } public function createCategory() { // If you create a category/categories seperated from the ticket and wants to // associate it to a ticket, you may do the following. $category = Category::create(...); $category->tickets()->attach($ticket); // or maybe $category->tickets()->detach($ticket); } ...
票务表结构
评论表结构
标签表结构
分类表结构
API方法
票务API方法
此模型包含方便的方法,可以快速构建,以下是可用的 API 列表
链式 列表示示方法的当前状态,即它是否可以链式调用,例如
$ticket->archive() ->close() ->markAsResolved();
票务关系API方法
此模型还有一系列方法用于与相关模型交互
attachCategories
和syncCategories
方法是attach
和sync
laravel 方法的替代方案,如果您想了解更多,请查看此 链接
commentAsUser
接受一个用户作为第一个参数,如果为null,则默认使用 已认证 用户。
票务作用域
此模型还有一系列作用域,可以开始过滤。
分类和标签作用域
处理文件上传
此包目前不包含文件上传功能。相反,您可以使用 laravel-medialibrary 由 Spatie 处理文件功能。
步骤非常直接,你需要做的就是以下内容。
通过在应用程序中创建一个新的模型文件来扩展 Ticket
模型。
php artisan make:model Ticket
然后扩展基本 Ticket Model
,然后使用 spatie 包中的 InteractWithMedia
特性和 HasMedia
接口。
namespace App\Models\Ticket; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; class Ticket extends \Renatoxm\LaravelTicket\Models\Ticket implements HasMedia { use InteractsWithMedia; }
其余的实现细节,请查阅 spatie 包的文档了解详情。
事件系统
所有事件都位于 Renatoxm\laravel-ticket\Events
命名空间中。
票据事件
以下事件是在触发了 Eloquent 事件后分发的。
- TicketCreating
- TicketCreated
- TicketSaving
- TicketSaved
- TicketUpdating
- TicketUpdated
- TicketDeleting
- TicketDeleted
评论事件
以下事件是在触发了 Eloquent 事件后分发的。
- CommentCreating
- CommentCreated
- CommentSaving
- CommentSaved
- CommentUpdating
- CommentUpdated
- CommentDeleting
- CommentDeleted
消费事件
use Renatoxm\LaravelTicket\Events\TicketCreated; Event::listen(function (TicketCreated $event) { dump($event->ticket->title); }); // or Event::listen(TicketCreated::class, [SomeListener::class, 'handle']);
测试
composer test
变更日志
请参阅变更日志了解最近的变化。
贡献
请参阅贡献指南了解详情。
安全漏洞
请查阅我们的安全策略了解如何报告安全漏洞。
鸣谢
- Renato Nabinger
- 从 ousid 分支而来
- 所有贡献者
许可证
MIT. 请参阅许可文件了解更多信息。