pr0kazn1k
5/19/2017 - 12:50 PM

VK callback event

VK callback event

<?

/*

В данном примере представлена часть кода, которая обрабатывает события в группе ВК по средствал Callback API группы.

При событии в группе ВК отправляет на указанный вами адрес запрос с данными о событии.

На основании типа события класс VkGroupEventFactory создает класс отвечающий за обработку события. 

Например, при событии wall_post_new (новый пост на стене группы), фабрикой будет создан класс PostNew, для дальнейшей обработки события.
Например, по средствам вызова метода notify, пользователь с id=325960478 получить личное сообещение от группы (заданой по средствам метода setGroupId)
с информацией о новом посте.

*/
<?php

namespace App\Qwog\Factory;

use \Exception;

/**
 * Class VkGroupEventFactory
 * @package App\Qwog\Factory
 */
class VkGroupEventFactory
{

    /**
     * @param $type
     * @return mixed
     * @throws Exception
     */
    public static function create($type)
    {
        $class = 'App\Qwog\VkGroupEvents\\' . self::parse($type);

        if (class_exists($class)) {
            return new $class;
        } else {
            throw new Exception('class (' . $class . ') not exists');
        }
    }

    /**
     * Парсим тип, чтобы свормировать название класса
     *
     * @param $type
     * @return array
     */
    protected static function parse($type)
    {
        $pos = strpos($type, '_');

        if ($pos === false) {
            $class = ucfirst($type);
        } else {
            $namespace = substr($type, 0, $pos);
            $subject = substr($type, $pos + 1);
            $class_name = preg_replace_callback ('/_(.)/', create_function('$matches','return strtoupper($matches[1]);'), $subject);
            $class_name = ($class_name == 'new') ? 'Fresh' : ucfirst($class_name);
            $class = ucfirst($namespace) . '\\' . $class_name;
        }

        return $class;
    }

}
<?php

namespace App\Qwog\VkGroupEvents;

use \getjump\Vk\Core as VkCore;
use App\Models\VkGroupCallback;
use App\Qwog\Services\AuthorEventService;

abstract class VkGroupEvent
{

    protected $object;

    /** @var VkGroupCallback */
    protected $group;

    protected $author;

    public function setObject($object)
    {
        if (!is_object($object)) {
            throw new \Exception('Not object');
        }
        $this->object = $object;

        if (!empty($object->user_id)) {
            $this->author = AuthorEventService::firstOrFail($user_id);
        }

        return $this;
    }

    public function setGroupId($group_id)
    {
        $group = VkGroupCallback::where('vk_group_id', $group_id)->firstOrFail();
        $this->group = $group;

        return $this;
    }

    abstract public function save();

    abstract protected function notifyMessage();

    public function notify()
    {
        $request_params = [
            'message' => $this->notifyMessage(),
            'user_id' => 325960478,
        ];

        $vk = VkCore::getInstance()->apiVersion('5.0')->setToken($this->group->token);
        $vk->request('messages.send', $request_params)->execute();
    }

    public function response()
    {
        $this->notify();
        return 'ok';
    }

}
<?php

namespace App\Qwog\VkGroupEvents\Wall;

use App\Qwog\VkGroupEvents\VkGroupEvent;

/**
 * Class PostNew
 * @package App\Qwog\VkGroupEvents\Wall
 */
class PostNew extends VkGroupEvent
{

    public function save() {}

    protected function notifyMessage()
    {
        return "[id{$this->author->id}|{$this->author->first_name} {$this->author->last_name}] написал(a) пост
        (https://vk.com/wall{$this->object->owner_id}_{$this->object->id})
        с текстом: {$this->object->text}";
    }

}