Tworzenie obiektów JSON, inicjacja kodu w API.

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

?>

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 => '/^\w+@[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}%  
0

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

0

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

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