sirs / tasks-multistatus

此包的最新版本(10.0.0)没有可用的许可证信息。


README

提供迁移、种子、模型、事件、 artisan 命令和作业以支持任务管理。

概述

任务是要由所有者(多态关系)完成或为其完成的待办事项。任务通过其 TaskType(Task 属于 TaskType)进行描述,并通过 TaskStatus(Task 属于 TaskStatus)表示其状态。

从版本 2.2.0 开始,您可以为任务 URL 路由定义一个任务路由器,将用户虚拟路由到任何地方(请参阅下面的 tasks.router 中间件)。从 2.2.0 版本开始,您可以在 config/tasks.php 中应用全局作用域(请参阅下面的 配置)。

版本

LaravelSirs\Tasks
10.010.0
9.09.0
6.06.0
5.74.0
5.5 - 5.63.x4.0
5.1 - 5.43.x
5.01.3.x

安装

  1. composer require sirs/tasks-multistatus
  2. 如果您未自动检测服务提供者,请将 Sirs\Tasks\TasksServiceProvider::class, 添加到 config/app.php
  3. 通过供应商发布以获取配置文件、迁移、默认种子器和默认 TaskRouter。
  4. 将您的 TaskTypeStatusSeeder 添加到 DatabaseSeeder.php,并在 database/seeds/type_status_definition.json 中定义您的任务类型和状态(注意,任何在您的 TaskType 或 TaskStatus 模型上可用的属性都可以在这里定义)。
  5. 任何将成为任务所有者的模型都必须实现 Sirs\Tasks\Interfaces\Taskowner,这可以通过使用 Sirs\Tasks\TaskOwnerTraits 来实现。
  6. 为您的 TaskOwner 模型创建 EloquentResources(可选)。

任务管理器

任务管理器可通过 /tasks/manager 访问。所有 HTML、CSS 和 JavaScript 都包含在内,并通过包进行路由。如果您需要自定义任务管理器,应将源文件复制到您的项目中,并按您的喜好使用/更新它。

cp -r vendor/sirs/tasks-multistatus/src/assets/js/components/Tasks resources/assets/js/components

注意:如果您以前使用过 sirs/tasks(即从模板中),您可能希望完全删除所有 sirs/tasks 内容并执行供应商发布以从头开始。

配置

根据您的项目自定义 TaskType 和 TaskStatus 种子器。然后根据需要更新配置。配置选项包括:

  • apiPrefix: 任务 API 路由的路径前缀。默认为 'api'
  • routeGroup: 任务路由的路由组。默认为 `['middleware' => ['auth','tasks.redirect']]`
  • owner_transformers: ownerTypeClass=>ownerTypeTransformerClass 的映射,其中转换器类是一个 Fractal Transformer。默认为空数组;
  • global_scopes: 应用于 Task 模型的全局作用域数组。默认为空数组
  • taskToAction: TaskType->slug => action 的映射。请参阅 config/tasks.php 中的示例
  • router: 与 tasks.router 中间件一起使用的任务路由器类名。默认为 published App\TaskRouter::class,
  • bindings.models: 使用您自己的模型,该模型符合相关接口设置此选项。示例
    ...
      'bindings' => [
        'models' => [
          'Task' => \App\Task::class,             // where \App\Task implements \Sirs\Tasks\Interfaces\Task
          'TaskType' => \App\TaskType::class,     // where \App\Task implements \Sirs\Tasks\Interfaces\TaskType
          'TaskStatus' => \App\TaskStatus::class, // where \App\Task implements \Sirs\Tasks\Interfaces\TaskStatus
        ]
      ],
    ...
    

tasks.router 中间件

在 App/Http/Kernel.php 中注册 task.redirect 中间件

protected $middlewareAliases = [
...
        'tasks.redirect' => \Sirs\Tasks\Middleware\RedirectTasks::class,
]

在 config/tasks.php 中自定义您的 taskActions 映射

    'taskToAction'=>[
      /** examples:
       * 'task-slug' => 'action_type:slugOrIdentifier'
       * 'survey-task' => 'survey:surveySlug',
       * 'schedule-appt-task' => 'appointment:apptTypeId',
       * 'redirect-to-url' => 'url:/path/to/thing'
       * 'custom-task' => 'custome:someIdentifier'
       **/
    ],

如果需要自定义任务路由功能,则在 TaskRouter.php 中修改 TaskRouter 类的 resolve 函数

  public function resolve(Task $task){
      $taskToAction = config('tasks.taskToAction');
      if( !isset($taskToAction[$task->taskType->slug]) ) return null;

      list($type, $identifier) = preg_split('/:/', $taskToAction[$task->taskType->slug]);

      switch ($type) {
        case 'survey':
          return url('app-participant/'.$task->owner->identifier.'/survey/'.$identifier);
        case 'appointment':
          $url = 'appointments/create?appointment_type_id='.$identifier.'&attendee_id='.$task->owner->identifier;
          switch ($identifier) {
            case 2:
              // $forTask = $task->owner->tasks->where('task_type_id', 1)->first();
              break;              
            default:
              $forTask = null;
              break;
          }
          $url = ( $forTask ) ? $url.'&task_id='.$forTask->identifier : $url;
          return url($url);
        case 'url':
          return url($identifier);
        default:
          return null;
          break;
      }
  }

此函数应返回用于 Laravel redirect() 辅助函数的 URL 或 null 以进行默认路由。

即使您已将任务类型映射到上面的操作,您也可以通过将 bypassRouter=1 添加到任务 URL 来绕过路由器。例如,我可以通过以下 URL 强制任务 383 使用默认任务表单: /tasks/383?bypassRouter=1

从版本 2.3.9 开始,中间件将传递原始任务 URL 上的查询字符串属性。

示例任务类型:任务123路由到/monkeys: http::project/tasks/123/food=fruit&drink=coffee 将重定向到 http::project/monkeys?food=fruit&drink=coffee

任务事件

任务生命周期事件构建在模型事件之上。

  • Sirs\Tasks\Events\TaskStarted
  • Sirs\Tasks\Events\TaskCompleted
  • Sirs\Tasks\Events\TaskCanceled
  • Sirs\Tasks\Events\TaskDataUpdated
  • Sirs\Tasks\Events\TaskCreated
  • Sirs\Tasks\Events\TaskStatusUpdated (已弃用)
  • Sirs\Tasks\Events\TaskWasCreated (已弃用)
  • Sirs\Tasks\Events\TaskStatusWasUpdated (已弃用)

TaskTypeWorkflowStrategy

为了帮助统一任务生命周期逻辑,现在可以创建工作流策略类,允许您编写处理sirs/tasks包中所有事件的代码。

TaskTypeWorkflowStrategy 应位于 app/Tasks 中,并通过任务和事件构造,具有对应于每个 TaskEvent 类型的相应方法

  • TaskStarted -> TaskTypeWorkflowStrategy::started
  • TaskDataUpdated - TaskTypeWorkflowStrategy::taskDataUpdated

可以使用以下命令生成这些文件的存根

php artisan tasks:workflow [task-type-slug|all]

使用 all 代替 task-type-slug 将为所有任务类型生成工作流策略类。

TaskTypeWorkflowStrategies 是可选的,不需要为任务类型创建。

命令

  • AutocancelTask - 将任务状态设置为自动取消
  • CancelTask - 将任务状态设置为已取消
  • CompleteTask - 将任务状态设置为已完成
  • FailTask - 将任务状态设置为失败
  • MissTask - 将任务状态设置为错过
  • StartTask - 设置 date_started 时间戳
  • UpdateTaskStatus (已弃用 使用 task->update())
  • CreateTask (已弃用 使用 Task::create(...))
  • DeleteTask (已弃用 使用 task->delete())

任务所有者

将成为任务所有者的模型必须实现 Sirs\Tasks\Interfaces\Taskowner。这可以通过在模型上使用 Sirs\Tasks\TaskOwnerTraits 特性并给模型提供一个返回所有者全名的 fullName 方法来实现。TaskOwnerTraits 为模型提供与任务的多对多关系。

您可以在配置中可选地定义任务所有者的 Eloquent 资源

...
"owner_resources" => [
  User::class => MyUserResource::class
]
...

任务管理界面

版本 2.3 引入了基本的任务管理界面,允许用户查看任务和更新任务状态和截止日期,而无需任务相关表单。

这些界面位于

默认任务表单

自版本 2.3 以来,现在有默认的任务表单。

该表单询问任务是否完成,并允许用户设置状态或如果未完成,则将任务保留为待办。

路由

任务 REST API

任务、类型和状态的 REST API 控制器。

我应该和谁联系?

  • TJ Ward - jward3@email.unc.edu