Ну что же, начнём? Только не плакать потом, сами попросили.
Итак, начнем с архитектуры. Начнем с того, что код чем только не занимается, он и из консоли запускает и как веб-хук и т.д. Сам по себе он является куском битрикса в том или ином виде.
Далее - код использует ООП, но написан в процедурном стиле.
Уже за это надо проявлять насилие над личностью.
<?php
include "bitrix.php";
include "function.php";
require_once '../src/db.php';
Просто используйте
require_once.
use
должен быть вверху файла.
$id = $_GET['id'];
Будет генерировать ошибки, если скрипт был вызван без
id
.
$select = $db->query("SELECT * FROM tg_bot WHERE tg_bot.id='$id'");
Добро пожаловать в мир
SQL-инъекций.
$bot_token = $select[0]['api_key'];
Что произойдет, если бот не существует? Ошибки.
define('BOT_TOKEN', "$bot_token");
Бить железной линейкой по пальцам. Сильно. Больно. Долго.
Нельзя использовать переменные внутри
define
. Эта инструкция придумана для объявления констант. Объявлять константы используя переменные недопустимо.
if (php_sapi_name() == 'cli') {
apiRequest('setWebhook', array('url' => isset($argv[1]) && $argv[1] == 'delete' ? '' : WEBHOOK_URL));
exit;
}
Жуть какая-то.
$content = file_get_contents("php://input");
$update = json_decode($content, true);
if (!$update) {
exit;
}
Я так понимаю, что здесь происходит вызов самого веб-хука.
Ну а дальше просто идет месиво. Смешались в кучу кони, люди...
Что с этим можно сделать?
Вызубрить ООП и
getjump.github.io/ru-php-the-right-way
Вспомните принцип "Разделяй и властвуй".
Разделяйте код по функционалу и уровням абстрации.
Например разделите код на работу с базой, на работу с API, на бизнес-логику.
Например ваш код мог бы выглядеть так:
// добавляем автозагрузку классов
require_once 'vendor/autoload.php';
// импортируем конфигурацию
require_once 'config.php';
use Chaly/Bot;
// проверяем, что наш скрипт вызван с индентификтором бота
if (!isset($_GET['id'])) {
exit(1); // ненулевой статус говорит об ошибке
}
// загрузить робота из базы данных
$bot = Bot::loadById($_GET['id']);
if (!$bot) {
exit(1);
}
// запустить робота
$bot->run();
Как может выглядеть тело run()
public function run() {
if (Cli::isValid()) {
switch (Cli::getCommand()) {
case 'delete':
$this->delete();
break;
case 'register':
$this->register();
break;
}
return;
}
$payload = $this->getWebHookPayload();
if (!$payload) {
return;
}
if (isset($payload['message'])) {
$this->interpretMessage($payload['message']);
}
// и так далее, думаю смысл понятен
}