Tworzenie obiektów JSON, inicjacja kodu w API.

Odpowiedz Nowy wątek
2016-08-09 09:52

Rejestracja: 5 lat temu

Ostatnio: 9 miesięcy temu

0

EDIT,
dzięki za odpowiedź i pomoc. Mimo wszystko przebudowałem swój kod i wcisnąłem wszystko w jedną klasę. Chciałbym się dowiedzieć jak w poprawny sposób zainicjować tę apkę aby działała, że tak nazwę w 'stand-by'. Jest to chatbot oparty na facebookowym api. Wcześniej, jak kod był nie podzielony na klasy ani metody, odpowiadał na wiadomość od razu, bez względu na to, kiedy użytkownik napisał. Ogólnie działanie opisałbym tak: użytkownik pisze na facebooku, ja otrzymuje JSONa jako string, dekoduje go na tablice, wyciągam $userId i $userText, sprawdzam w switchu czy $userText zgadza się z którymś z słów kluczowych i na tej podstawie tworzę JSONa z odpowiednią odpowiedzią i wysyłam go metodą post.

<?php

    define('TOKEN_URL', 'my_secret_url');
    define('TOKEN_VERIFY', 'my_voice');

    class Message{

        // jak ją zainicjować?
        public function __construct(){
            $this->verify();
            $this->getMessage();
            $this->parseMessage();
            $this->sendResponse();
        }

        public static $userId;
        public static $userText;
        public static $messageType;
        public static $tokenVerify = 'codeandpepper';

        public function verify(){
            if (isset($_GET['hub_verify_token'])) {
                if ($_GET['hub_verify_token'] === TOKEN_VERIFY) {
                    echo $_GET['hub_challenge'];
                    return;
                } else {
                    echo 'Invalid Verify Token';
                    return;
                }
            }
        }

        public function getMessage(){
            $input = json_decode(file_get_contents('php://input'), true);
            self::$userId = $input['entry'][0]['messaging'][0]['sender']['id'];
            self::$userText = $input['entry'][0]['messaging'][0]['message']['text'];
        }

        const KEYWORD_HELP = 'help';
        const KEYWORD_TIME = 'time';
        const KEYWORD_START = 'start';
        const KEYWORD_STOP = 'stop';
        const KEYWORD_TODAY = 'today';
        const KEYWORD_REPORT = 'report';

        public function parseMessage(){

            $messageText = self::$userText;
            switch (true) {
                case self::KEYWORD_TODAY:
                    self::$messageType = "time";
                    break;
                case self::KEYWORD_REPORT:
                    self::$messageType = "report";
                    break;
                case (preg_match('/time/', $messageText) !== false):
                    self::$messageType = "time";
                    break;
                case (preg_match('start/', $messageText) !== false):
                    self::$messageType = "start";
                    break;
                case self::KEYWORD_STOP:
                    self::$messageType = "stop";
                    break;
                case self::KEYWORD_HELP:
                    self::$messageType = "help";
                    break;
                default:
                    self::$messageType = "help";
                    break;
            }
        }

        public function sendResponse()
        {
            $jsonOutArr = array(
                "recipient" => array(
                    "id" => self::$userId
                ),
                "message" => array(
                    "text" => "Going to answer for command: " .self::$messageType
                ),
            );
            $output = json_encode($jsonOutArr);

            $outputUrl = "https://graph.facebook.com/v2.6/me/messages?access_token=".TOKEN_URL;

            $ch = curl_init($outputUrl);
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($ch, CURLOPT_POSTFIELDS, $output);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                    'Content-Type: application/json',
                    'Content-Length: ' . strlen($output))
            );
            return curl_exec($ch);
        }
    }

?>
edytowany 2x, ostatnio: bastun, 2016-08-09 15:06

Pozostało 580 znaków

2016-08-09 10:38

Rejestracja: 4 lata temu

Ostatnio: 15 godzin temu

0

Jedyne co zrozumiałem, to że chcesz dynamicznie tworzyć klasy na podstawie inputa. To co mogę podpowiedzieć, to że w PHP możesz bardzo łatwo tworzyć klasy na podstawie stringa.

<?php

class MessageFactory {

  /**
   * $key to klasa, która zostanie utworzona
   * po zmatchowaniu wartości
   * $value - regexp po którym matchujemy
   */
  public static $keywords = [
    Example::class => '/^\[email protected][a-zA-Z_]+?\.[a-zA-Z]{2,3}$/',
    Help::class => '/^help/'
  ];

  public static function getMessage($input) {
    foreach (self::$keywords as $className => $pattern) {

        if(preg_match($pattern, $input) && class_exists($className)) {
            return new $className($input);
        }

    }

    throw new Exception('Brak klasy');
  }
}

class Example {
    private $message;

    public function __construct($message) {
        $this->message = $message;
    }

    public function getJson() {
        $response = [
            'message' => "Json z klasy " . __CLASS__ . ": $this->message",
            'success' => true
        ];

        return json_encode($response);
    }
}

class Help {
    private $message;

    public function __construct($message) {
        $this->message = $message;
    }

    public function getJson() {
        $response = [
            'message' => "Json z klasy " . __CLASS__ . ": $this->message",
            'success' => true
        ];

        return json_encode($response);
    }
}

$input = '[email protected]';
$example = MessageFactory::getMessage($input);
echo $example->getJson();

$input = 'help';
$example = MessageFactory::getMessage($input);
echo $example->getJson();
// {"message":"Json z klasy Example: [email protected]","success":true}%  
// {"message":"Json z klasy Help: help","success":true}%  
edytowany 8x, ostatnio: Desu, 2016-08-09 10:55
dzięki za odpowiedź zmieniłem trochę swoją koncepcję, edytowałem pierwszy post - bastun 2016-08-09 15:07

Pozostało 580 znaków

2016-08-09 15:07

Rejestracja: 5 lat temu

Ostatnio: 9 miesięcy temu

0

dzięki za odpowiedź
zmieniłem trochę swoją koncepcję, edytowałem pierwszy post

Pozostało 580 znaków

2016-08-09 15:45

Rejestracja: 4 lata temu

Ostatnio: 15 godzin temu

0

Nie bardzo mam czas czytać ten kod, ale poczytaj o websocketach. Jeżeli chodzi o php to http://socketo.me/docs/hello-world

edytowany 1x, ostatnio: Desu, 2016-08-09 15:46

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0