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}";
}
}