nncodes / laravel-meeting
使用 Laravel 处理在线会议
Requires
- php: ^7.2.5|^7.3|^8.0
- guzzlehttp/guzzle: ^6.0|^7.0
- illuminate/contracts: ^6.0|^7.0|^8.0
- nncodes/laravel-meta-attributes: ^2.0
Requires (Dev)
- orchestra/testbench: ^4.0|^5.0|^6.0
- phpunit/phpunit: ^8.0|^9.0
- vimeo/psalm: ^4.3
README
官方文档
简介
此包可以处理使用 Eloquent 模型的在线会议。它提供了一个简单、流畅的 API 来操作,默认使用 Zoom 作为提供商。
use Nncodes\Meeting\Models\Meeting; use Nncodes\Meeting\Models\MeetingRoom; use App\Models\Event; use App\Models\Teacher; $meeting = Meeting::schedule() ->withTopic('English class: verb to be') ->startingAt(now()->addMinutes(30)) ->during(40) //in Minutes ->scheduledBy(Event::find(1)) ->presentedBy(Teacher::find(1)) ->hostedBy(MeetingRoom::find(1)) ->save();
需求
此包需要 PHP 7.3+ 和 Laravel 6+。
此包使用 nncodes/meta-attributes
将元属性附加到模型上。
安装与配置
您可以通过 composer 安装此包
composer require nncodes/laravel-meeting
包将自动注册自己。
您可以使用 meeting:install
命令发布迁移,如果还要发布配置文件,请使用 --config
。
php artisan meeting:install --config
或者您可以使用传统方式发布
php artisan vendor:publish --provider="Nncodes\Meeting\MeetingServiceProvider" --tag="migrations" php artisan vendor:publish --provider="Nncodes\MetaAttributes\MetaAttributesServiceProvider" --tag="migrations"
迁移发布后,您可以通过运行迁移来创建表
php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Nncodes\Meeting\MeetingServiceProvider" --tag="config"
这是已发布配置文件的内容
/** * Default Meeting Provider * * Here you can specify which meeting provider the package should use by * default. Of course you may use many providers at once using the package. */ 'default' => env('MEETING_PROVIDER', 'zoom'), /** * Meeting Providers * * Here are each of the meetings provider setup for the package. */ 'providers' => [ 'zoom' => [ /** * Provider class **/ 'type' => \Nncodes\Meeting\Providers\Zoom\ZoomProvider::class, /** * JWT Zoom Token * @see https://marketplace.zoom.us/docs/guides/auth/jwt **/ 'jwt_token' => env('ZOOM_TOKEN'), /** * Zoom Group ID * * @see https://marketplace.zoom.us/docs/api-reference/zoom-api/groups/group **/ 'group_id' => env('ZOOM_GROUP'), /** * Share Rooms * * Delegate to the package the responsability of handling the allocations of rooms. **/ 'share_rooms' => true, /** * Meeting resource seetings * * @see https://marketplace.zoom.us/docs/api-reference/zoom-api/meetings/meeting **/ 'meeting_settings' => [ "host_video" => false, "participant_video" => false, "join_before_host" => false, "jbh_time" => 0, "mute_upon_entry" => true, "approval_type" => 0, "registration_type" => 1, "close_registration" => true, "waiting_room" => true, "registrants_confirmation_email" => false, "registrants_email_notification" => false, "meeting_authentication" => false ] ] ], /** * Allow concurrent Meetings */ 'allow_concurrent_meetings' => [ 'host' => false, 'participant' => false, 'presenter' => false, 'scheduler' => true, ]
准备你的模型
调度器
负责安排会议,模型必须实现以下接口和特质
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Nncodes\Meeting\Concerns\SchedulesMeetings; use Nncodes\Meeting\Contracts\Scheduler; class Event extends Model implements Scheduler { use SchedulesMeetings; }
演示者
负责演示会议,模型必须实现以下接口和特质
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Nncodes\Meeting\Concerns\PresentsMeetings; use Nncodes\Meeting\Contracts\Presenter; class Teacher extends User implements Presenter { use PresentsMeetings; }
主持人
负责主持会议,模型必须实现以下接口和特质
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Nncodes\Meeting\Concerns\HostsMeetings; use Nncodes\Meeting\Contracts\Host; class Room extends Model implements Host { use HostsMeetings; }
参与者
允许加入会议,模型必须实现以下接口、特质以及 getEmailAddress
、getFirstName
和 getLastName
方法
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Nncodes\Meeting\Concerns\JoinsMeetings; use Nncodes\Meeting\Contracts\Participant; class Student extends User implements Participant { use JoinsMeetings; /** * Email Address of the participant * * @return string */ public function getParticipantEmailAddress(): string { return $this->email; } /** * First name of the participant * * @return string */ public function getParticipantFirstName(): string { return $this->first_name; } /** * Last name of the participant * * @return string */ public function getParticipantLastName(): string { return $this->last_name; } }
安排会议
要安排会议,您需要使用以下方法正确填写会议数据
use Nncodes\Meeting\Models\Meeting; use App\Models\Event; use App\Models\Teacher; use App\Models\Room; $event = Event::find(1); $teacher = Teacher::find(1); $room = Room::find(1); $meeting = Meeting::schedule() ->withTopic('English class: verb to be') ->startingAt(now()->addMinutes(30)) ->during(40) //minutes ->scheduledBy($event) ->presentedBy($teacher) ->hostedBy($room) ->save();
或者您也可以通过 scheduler
模型安排
use Nncodes\Meeting\Models\Meeting; use App\Models\Event; use App\Models\Teacher; use App\Models\Room; $event->scheduleMeeting() ->withTopic('English class: verb to be') ->startingAt(now()->addMinutes(30)) ->during(40) //minutes ->presentedBy($teacher) ->hostedBy($room) ->save()
当然,如果需要,您可以更新会议
use Nncodes\Meeting\Models\Meeting; use App\Models\Event; use App\Models\Teacher; use App\Models\Room; $meeting = Meeting::find(1); $meeting->updateTopic('English class: Introducing Yourself') ->updateDuration(60) ->updateStartTime(now()) ->updateScheduler(Event::find(1)) ->updatePresenter(Teacher::find(5)) ->updateHost(Room::find(1)) ->save();
然后您可以添加参与者
use Nncodes\Meeting\Models\Meeting; use App\Models\Student; $meeting = Meeting::find(1); $student = Student::find(1); //By the meeting model $meeting->addParticipant($student); //Or by the participant model $student->bookMeeting($meeting);
要提供对演示者的访问,请使用
use Nncodes\Meeting\Models\Meeting; Meeting::find(1)->getPresenterAccess();
对于参与者,请使用
use Nncodes\Meeting\Models\Meeting; use App\Models\Student; $student = Student::find(1); Meeting::find(1)>getParticipantAccess($student);
更多: 处理已安排的会议。
检索会议
您可以直接从会议模型调用
通过 Nncodes\Meeting\Models\Meeting
范围化会议。
$query = Meeting::query();
或者从任何行为者调用 meetings()
从调度器模型范围化会议,例如,使用 App\Models\Event
并带有 id:1
。
$query = Event::find(1)->meetings();
从演示者模型范围化会议,例如,使用 App\Models\Teacher
并带有 id:1
。
$query = Teacher::find(1)->meetings();
从主持人模型范围化会议,例如,使用 App\Models\Room
并带有 id:1
。
$query = Room::find(1)->meetings();
从参与者模型范围化会议,例如,使用 App\Models\Student
并带有 id:1
。
$query = Student::find(1)->meetings();
Eloquent 范围
一般范围
通过 uuid
范围化,例如 b33cac3a-c8da-4b33-a296-30a6acff5af6
。
$query->byUuid('b33cac3a-c8da-4b33-a296-30a6acff5af6');
通过 id
范围化,例如 1
。
$query->byId(1);
通过提供商范围化,例如 zoom
。
$query->provider('zoom');
对 start_time
、started_at
和 ended_at
的范围
从指定时间开始范围化,例如 15 天前
。
$query->startsFrom(Carbon::now()->sub('15 days'));
直到指定时间范围化,例如 15 天后
。
$query->startsUntil(Carbon::now()->add('15 days'));
或者在一个时间段内范围化,例如从 15 天前
到 15 天后
。
$query->startsBetween( Carbon::now()->sub('15 days'), Carbon::now()->add('15 days') );
通过状态 live
范围化,即已开始但尚未结束的会议。
$query->live();
通过状态 past
范围化,即已开始并结束的会议。
$query->past();
通过状态 scheduled
范围化,即尚未开始的会议。
$query->scheduled();
通过预定
状态进行范围限定,且start_time
已过去。查询即将开始的会议。
$query->late();
通过实时
状态进行范围限定,且started_at
+ duration
已过去。查询已超过预定时长的会议。
$query->exceeded();
通过预定
状态进行范围限定,按start_time
升序排序。查询下一场会议。
$query->next();
通过最后
状态进行范围限定,按ended_at
降序排序,查询最后一场会议。
$query->last();
针对演员的范围限定
通过调度器进行范围限定,例如App\Models\Event
的id:1
。
$query->scheduler(Event::find(1));
通过主持人进行范围限定,例如App\Models\Room
的id:1
。
$query->host(Room::find(1));
通过参与者进行范围限定,例如App\Models\Student
的id:1
。
$query->participant(Student::find(1));
通过演讲者进行范围限定,例如App\Models\Teacher
的id:1
。
$query->presenter(Teacher::find(1));
最后,您可以通过调用任何Eloquent检索方法来检索数据,例如count
、first
、get
、paginate
等。
处理已安排的会议
会议
当使用Zoom提供者时,您可以设置share_rooms
为true
,然后在安排会议时无需通知主持人。该包处理房间的分配。
在这种情况下,您可以安排使用
use Nncodes\Meeting\Models\Meeting; use App\Models\Event; use App\Models\Teacher; $meeting = Meeting::schedule() ->withTopic('English class: verb to be') ->startingAt(now()->addMinutes(30)) ->during(40) //minutes ->scheduledBy(Event::find(1)) ->presentedBy(Teacher::find(1)) ->save();
如果没有可用房间,将抛出异常\Nncodes\Meeting\Exceptions\NoZoomRoomAvailable
。
use Nncodes\Meeting\Models\Meeting;
开始会议。
Meeting::find(1)->start();
结束会议。
Meeting::find(1)->end();
取消会议。
Meeting::find(1)->cancel();
参与者
添加参与者
通过Nncodes\Meeting\Models\Meeting
添加参与者
$student = Student::find(1); Meeting::find(1)->addParticipant($student);
通过参与者模型App\Models\Student
添加参与者
$meeting = Meeting::find(1); Student::find(1)->bookMeeting($meeting);
取消参与
通过Nncodes\Meeting\Models\Meeting
取消参与
$student = Student::find(1); Meeting::find(1)->cancelParticipation($student);
通过参与者模型App\Models\Student
添加参与者
$meeting = Meeting::find(1); Student::find(1)->cancelMeetingParticipation($meeting);
加入会议
通过Nncodes\Meeting\Models\Meeting
加入
$student = Student::find(1); Meeting::find(1)->joinParticipant($student);
通过参与者模型App\Models\Student
加入
$meeting = Meeting::find(1); Student::find(1)->joinMeeting($meeting);
离开会议
通过Nncodes\Meeting\Models\Meeting
离开
$student = Student::find(1); Meeting::find(1)->leaveParticipant($student);
通过参与者模型App\Models\Student
离开
$meeting = Meeting::find(1); Student::find(1)->leaveMeeting($meeting);
获取参与者
获取一个参与者
$student = Student::find(1); $participant = Meeting::find(1)->participant($student);
检查会议是否有参与者
$student = Student::find(1); $bool = Meeting::find(1)->hasParticipant($student);
使用morphMany关系获取参与者列表
//Must inform the participant model type $participants = Meeting::find(1)->participants(App\Models\Student::class)->get();
或使用participantsPivot关系。
//Doesn't need to inform participant model type, it gets all types. $participants = Meeting::find(1)->participantsPivot;
按created_at
降序获取第一个参与者,它允许将会议用作队列模式服务。
$participant = Meeting::find(1)->getNextParticipant();
主持人
范围和验证方法
给定以下代码
use Nncodes\Meeting\Models\MeetingRoom; $startTime = Carbon::now()->addMinutes(30); $duration = 40; $endTime = (clone $startTime)->addMinutes($duration);
范围限定可用的主持人
MeetingRoom::availableBetween($startTime, $endTime);
范围限定忙碌的主持人
MeetingRoom::busyBetween($startTime, $endTime);
范围限定忙碌和可用的主持人,除了会议之外
use Nncodes\Meeting\Models\Meeting; $except = Meeting::find(1); MeetingRoom::availableBetween($startTime, $endTime, $except); MeetingRoom::busyBetween($startTime, $endTime, $except);
然后您可以调用任何Eloquent检索方法,例如count
、first
、get
、paginate
等。
您还可以检查房间实例是忙碌还是可用
use Nncodes\Meeting\Models\MeetingRoom; MeetingRoom::find(1)->isAvailableBetween($startTime, $endTime); MeetingRoom::find(1)->isBusyBetween($startTime, $endTime);
与范围方法一样,您也可以指定查询中要排除的会议
use Nncodes\Meeting\Models\MeetingRoom; use Nncodes\Meeting\Models\Meeting; $except = Meeting::find(1); MeetingRoom::find(1)->isAvailableBetween($startTime, $endTime, $except); MeetingRoom::find(1)->isBusyBetween($startTime, $endTime, $except);
变更日志
有关最近更改的更多信息,请参阅变更日志。
贡献
有关详细信息,请参阅贡献指南。
安全漏洞
有关如何报告安全漏洞的详细信息,请参阅我们的安全策略。
致谢
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。