Laravel Проблема с Botman - Невозможно вызвать функции из одного и того же класса после вложения в класс Botman. - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь использовать встроенную функцию кнопок и вопросов в Botman внутри laravel, однако я изо всех сил пытаюсь понять, как объединять функции без использования функций * stati c. У меня это работает, где все функции stati c, однако я хочу использовать всю собранную информацию для отправки по электронной почте.

    // initialization function
     public function handle()
     {
         $botman->hears("{message}", function($botman, $message) {
                $this->selectHelpQuery($botman);
         });
     }

     // ask question function 
     public function selectHelpQuery($botman)
     {
         $question = Question::create("How can i help you, would you like to know about the following:")
                ->fallback("Unable to help at this time, please try again later")
                ->callbackId("choose_query")
                ->addButtons([
                    Button::create("button1")->value("val1"),
                    Button::create("button2")->value("val2"),
                ]);
          $botman->ask($question, function (Answer $answer, $botman) {
              // Detect if button was clicked:
              if ($answer->isInteractiveMessageReply()) {
                  if($answer->getValue() == "val1") 
                  {
                      $this->contactFollowUp($botman); //** not working
                  } else {
                      $this->contactNoFollowUp($botman); //** not working
                  }
              }
          });
      }

// other functions.....

Однако без объявления функции contactFollowUp() как stati c и доступа к ней с помощью имени класса BotManController::contactFollowUp($botman) Однако, если я это делаю, у меня возникают проблемы с доступом и настройкой данных для использования в других функциях , В частности, я получаю метод contactFollowUp не существует ошибки.

1 Ответ

0 голосов
/ 12 марта 2020

Итак, после нахождения некоторых примеров кода на github мне удалось решить проблему. Это связано с тем, как структурирована структура ботмена. Чтобы получить связанные разговоры, вы должны использовать функцию из среды ботмена под названием startConversation(), чтобы вызвать ее, вам нужно сослаться на bot, что из расширенного базового класса Conversation. Таким образом, вам понадобится точка входа, а затем беседа, на которую вы хотите связать, например: * обратите внимание, вам понадобится точка входа по умолчанию run () для каждого разговора.

//BotManController.php
<?php

    namespace App\Http\Controllers\Chatbot;

    use App\Http\Controllers\Controller;
    use BotMan\BotMan\BotMan;
    use Illuminate\Http\Request;
    use BotMan\BotMan\Messages\Incoming\Answer;
    use BotMan\BotMan\Messages\Outgoing\Actions\Button;
    use BotMan\BotMan\Messages\Outgoing\Question;

    class BotManController extends Controller
    {
        /**
         * start the conversation on intitlization
         */
        public function handle()
        {
            $botman = app("botman");
            $botman->hears("{message}", function($botman, $message) {
                $botman->startConversation(new BotManStart);
            });
            $botman->listen();
        }
    }

Затем

// BotManStart.php    
<?php

    namespace App\Http\Controllers\Chatbot;

    use BotMan\BotMan\BotMan;
    use Illuminate\Http\Request;
    use BotMan\BotMan\Messages\Incoming\Answer;
    use BotMan\BotMan\Messages\Outgoing\Actions\Button;
    use BotMan\BotMan\Messages\Outgoing\Question;
    use BotMan\BotMan\Messages\Conversations\Conversation;

    class BotManStart extends Conversation
    {
        public function run()
        {
            $this->selectHelpQuery();
        }

        public function selectHelpQuery()
        {
            $question = Question::create("How can i help you, would you like to know about the following: ")
                ->fallback("Unable to help at this time, please try again later")
                ->callbackId("choose_query")
                ->addButtons([
                    Button::create("Button 1")->value("button1"),
                    Button::create("Button 2")->value("button2"),
                ]);
            $this->ask($question, function (Answer $answer) {
                if ($answer->isInteractiveMessageReply()) {
                    switch ($answer->getValue()) {
                        case "button1":
                            $this->bot->startConversation(new BotManConversation1());
                            break;
                        case "button2":
                            $this->bot->startConversation(new BotManConversation2());
                            break;
                    }
                }
            });
        }
    }
...