Skip to content
This repository has been archived by the owner on Feb 18, 2024. It is now read-only.

LaravelRUS/laravel-vk-requester

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

40 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Laravel VK Requester

GitHub license Packagist Version Packagist Stats

Пакет предоставляет удобный способ выполнения запросов к API социальной сети Vk.Сom.

Запросы выполняются в фоновом режиме, используя систему очередей Laravel. На каждый ответ от API генерируется событие, на которое можно подписаться, обработать/сохранить полученные данные и, при необходимости, добавить новые запросы.

Благодаря такому подходу можно гибко выстраивать цепочки из нескольких взаимосвязанных запросов, добавляя в очередь "дочерние" запросы при получении ответа от "родительского".

Например:

    # Получить группы по списку ID
    - groups.getByIds

            # Для каждой группы получить участников
            - groups.getMembers

                    # Каждого участника добавить себе в друзья
                    - friends.add

            # Для каждой группы получить посты
            - wall.get

                    # Для каждого поста получить комментарии
                    - wall.getComments

А благодаря автоматическому оборачиванию запросов в "execute-запросы" (по 25 в каждом), выполнение происходит в разы быстрее и понижается вероятность превышения лимитов Vk.Com на кол-во и частоту запросов.

А можно я без очереди? Мне только спросить..

Конечно можно! В состав пакета входит простой и удобный API-клиент - atehnix/vk-client, о возможностях которого можно узнать в его документации.

Впрочем, можно и вовсе установить только его, если вам не нужны очереди запросов :).

А если нужны, то продолжим:

Установка

Для установки через Composer, выполнить:
composer require atehnix/laravel-vk-requester
Добавить в массив providers в файле config/app.php:
ATehnix\LaravelVkRequester\VkRequesterServiceProvider::class,
Выполнить:
php artisan vendor:publish --provider="ATehnix\LaravelVkRequester\VkRequesterServiceProvider"
и
php artisan migrate

Внимание! Предполагается, что в вашем Laravel проекте уже настроены очереди и планировщик задач (Cron).

Добавление запроса в очередь

<?php
use ATehnix\LaravelVkRequester\Models\VkRequest;

VkRequest::create([
    'method'     => 'wall.get',
    'parameters' => ['owner_id' => 1],
    'token'      => 'some_token',
]);

Раз в минуту (по Cron'у) из таблицы временного хранения все новые запросы переносятся в основную очередь Laravel.

Для уменьшения кол-ва реальных обращений к API, все запросы будут автоматически обернуты в "execute-запросы" по 25 в каждом.

Подписка на ответы API

В качестве удобного способа подписки на ответы API рекомендуется использовать классы, наследованные от ATehnix\LaravelVkRequester\Contracts\Subscriber.

Метод onSuccess($request, $response) будет вызываться при успешном выполнении запроса, а метод onFail($request, $error) при неудачном.

Пример:

<?php

use ATehnix\LaravelVkRequester\Contracts\Subscriber;
use ATehnix\LaravelVkRequester\Models\VkRequest;

class WallGetSubscriber extends Subscriber
{
    /** @var string  Метод API запроса */
    protected $apiMethod = 'wall.get';
    
    /** @var string  Тэг запроса */
    protected $tag = 'default';

    public function onSuccess(VkRequest $request, $response)
    {
        foreach ($response['items'] as $item) {
            // do something...
        }
    }

    public function onFail(VkRequest $request, array $error)
    {
        \Log::alert('Request failed!');
    }
}

Все Subscriber'ы необходимо добавить в массив $subscribe провайдера EventServiceProvider.

<?php

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

    // ...
}

Генерируемые события

Конечно же, слушать ответы API можно и без создания Subscriber'а. Все запросы генерируют события определенного формата, которые вы можете "слушать" как описано в разделе "Events" документации Laravel.

В случае успешного выполнения, генерируется событие формата:
vk-requester.success: wall.get #default
В случае ошибки выполнения, генерируется событие формата:
vk-requester.fail: wall.get #default

Контекст запросов

По-умолчанию, в имени события присутствует тэг #default. При добавлении запроса вы можете в атрибуте tag указать любое другое значение тега. Тэг позволяет добавить запросам дополнительный "признак", когда требуется отличать их от других запросов с тем же методом.

Кроме того, через атрибут запроса context можно передать массив с любыми дополнительными данными, которые вы сможете получить при обработке события ($request->context).

Где взять API токен?

Перед тем как начать отправлять запросы, необходимо получить API Token. Ниже представлен один из способов его получить.

Добавьте в config/services.php:
<?php return [
    // ...

    'vkontakte' => [
        'client_id'     => env('VKONTAKTE_KEY'),
        'client_secret' => env('VKONTAKTE_SECRET'),
        'redirect'      => env('VKONTAKTE_REDIRECT_URI'),
    ],
];

В файле .env укажите соответствующие параметры авторизации вашего VK-приложения.

Пример получения токена
<?php

Route::get('vkauth', function (\ATehnix\VkClient\Auth $auth) {
    echo "<a href='{$auth->getUrl()}'> Войти через VK.Com </a><hr>";

    if (Request::exists('code')) {
        echo 'Token: '.$auth->getToken(Request::get('code'));
    }
});

Пример демонстрирует лишь сам принцип получения токена. Как и где вы будете его получать и хранить вы решаете сами.

License

MIT