Skip to content

Laravel 集成示例

在控制器中使用

基本通知控制器

php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Yuxin\Feishu\Enums\MessageTypeEnum;

class NotificationController extends Controller
{
    public function sendNotification(Request $request): JsonResponse
    {
        $request->validate([
            'user_id' => 'required|string',
            'message' => 'required|string'
        ]);

        try {
            app('feishu.message')->send(
                $request->user_id,
                MessageTypeEnum::Text->value,
                $request->message
            );

            return response()->json(['success' => true]);
        } catch (\Exception $e) {
            return response()->json(['error' => $e->getMessage()], 500);
        }
    }
}

依赖注入方式

php
<?php

namespace App\Http\Controllers;

use Yuxin\Feishu\Message;
use Yuxin\Feishu\Enums\MessageTypeEnum;

class NotificationController extends Controller
{
    public function __construct(private Message $message) {}

    public function sendNotification(Request $request)
    {
        $this->message->send(
            $request->user_id,
            MessageTypeEnum::Text->value,
            $request->message
        );
    }
}

在服务类中使用

通知服务类

php
<?php

namespace App\Services;

use Yuxin\Feishu\Enums\MessageTypeEnum;
use Illuminate\Support\Facades\Log;

class NotificationService
{
    public function sendTaskReminder(string $userId, array $taskData): bool
    {
        try {
            $content = $this->buildTaskReminderContent($taskData);

            app('feishu.message')->send(
                $userId,
                MessageTypeEnum::Interactive->value,
                $content
            );

            Log::info('任务提醒发送成功', ['user_id' => $userId]);
            return true;
        } catch (\Exception $e) {
            Log::error('任务提醒发送失败', ['error' => $e->getMessage()]);
            return false;
        }
    }

    private function buildTaskReminderContent(array $taskData): array
    {
        return [
            'config' => ['wide_screen_mode' => true],
            'header' => [
                'title' => ['tag' => 'plain_text', 'content' => '任务提醒'],
                'template' => 'red'
            ],
            'elements' => [
                [
                    'tag' => 'div',
                    'text' => [
                        'tag' => 'lark_md',
                        'content' => "**任务**: {$taskData['title']}\n**截止时间**: {$taskData['deadline']}"
                    ]
                ]
            ]
        ];
    }
}

在队列中使用

php
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Yuxin\Feishu\Enums\MessageTypeEnum;

class SendFeishuNotification implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(
        private string $userId,
        private string $message
    ) {}

    public function handle(): void
    {
        app('feishu.message')->send(
            $this->userId,
            MessageTypeEnum::Text->value,
            $this->message
        );
    }
}

错误处理

php
<?php

use Yuxin\Feishu\Exceptions\HttpException;
use Yuxin\Feishu\Exceptions\InvalidArgumentException;
use Illuminate\Support\Facades\Log;

try {
    app('feishu.message')->send('user_id', 'text', 'Hello');
} catch (HttpException $e) {
    Log::error('飞书API错误', ['error' => $e->getMessage()]);
} catch (InvalidArgumentException $e) {
    Log::error('飞书参数错误', ['error' => $e->getMessage()]);
} catch (\Exception $e) {
    Log::error('飞书未知错误', ['error' => $e->getMessage()]);
}

事件监听

SDK 提供了完整的事件系统,可以监听各种操作成功的事件:

注册事件监听器

EventServiceProvider 中注册:

php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use App\Listeners\LogFeishuMessage;
use Yuxin\Feishu\Events\MessageSent;
use Yuxin\Feishu\Events\UserSearched;
use Yuxin\Feishu\Events\GroupSearched;
use Yuxin\Feishu\Events\AccessTokenGenerated;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        MessageSent::class => [
            LogFeishuMessage::class,
        ],
        UserSearched::class => [
            LogUserSearch::class,
        ],
        GroupSearched::class => [
            LogGroupSearch::class,
        ],
        AccessTokenGenerated::class => [
            LogTokenGeneration::class,
        ],
    ];

    public function boot(): void
    {
        parent::boot();
    }
}

创建监听器

php
<?php

namespace App\Listeners;

use Yuxin\Feishu\Events\MessageSent;
use Illuminate\Support\Facades\Log;

class LogFeishuMessage
{
    public function handle(MessageSent $event): void
    {
        Log::channel('feishu')->info('消息发送成功', [
            'to' => $event->to,
            'message_type' => $event->messageType,
            'message_id' => $event->messageId,
            'timestamp' => now(),
        ]);
    }
}

事件订阅者

如果需要监听多个事件,可以使用订阅者模式:

php
<?php

namespace App\Listeners;

use Yuxin\Feishu\Events\MessageSent;
use Yuxin\Feishu\Events\UserSearched;
use Yuxin\Feishu\Events\GroupSearched;
use Yuxin\Feishu\Events\AccessTokenGenerated;
use Illuminate\Support\Facades\Log;

class FeishuEventSubscriber
{
    public function handleMessageSent(MessageSent $event): void
    {
        Log::info('消息发送成功', [
            'to' => $event->to,
            'message_type' => $event->messageType,
            'message_id' => $event->messageId,
        ]);
    }

    public function handleUserSearched(UserSearched $event): void
    {
        Log::info('用户搜索成功', [
            'username' => $event->username,
            'user_id' => $event->getUserId(),
        ]);
    }

    public function handleGroupSearched(GroupSearched $event): void
    {
        Log::info('群组搜索成功', [
            'query' => $event->query,
            'chat_id' => $event->getChatId(),
        ]);
    }

    public function handleAccessTokenGenerated(AccessTokenGenerated $event): void
    {
        Log::info('访问令牌生成', [
            'from_cache' => $event->isFromCache(),
            'token' => $event->getToken(),
        ]);
    }

    public function subscribe($events): array
    {
        return [
            MessageSent::class => 'handleMessageSent',
            UserSearched::class => 'handleUserSearched',
            GroupSearched::class => 'handleGroupSearched',
            AccessTokenGenerated::class => 'handleAccessTokenGenerated',
        ];
    }
}

EventServiceProvider 中注册订阅者:

php
<?php

namespace App\Providers;

use App\Listeners\FeishuEventSubscriber;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    protected $subscribe = [
        FeishuEventSubscriber::class,
    ];
}

Released under the MIT License.