Registrace třídy v SOAP pomocí setClass

Allconius
Člen | 313
+
0
-

Ahoj, vytvořil jsem si v modelu třídu clKonektor:

<?php

namespace App\Model;

use Nette;

class clKonektor
{
    use Nette\SmartObject;

    /** @var Nette\Database\Context */
    private $database;
    private $tabulka;
    private $tabulkakriteria;
    private $tabulkauchazeci;
    private $tabulkakomiseotevirani;
    private $tabulkakomiseoteviranidata;
    private $tabulkakomiseposuzovani;
    private $tabulkakomiseposuzovanidata;
    private $tabulkakomisevyber;
    private $tabulkakomisevyberdata;
    private $tabulkadodatky;
    private $tabulkasoubory;
    private $dnesnidatumstmp;
    private $dnesnidatum;
    private $login;
    private $password;

    public function __construct(Nette\Database\Context $database, $login=NULL, $password=NULL)
    {
        $this->database = $database;
        $this->tabulka="zakazky";
        $this->tabulkakriteria="kriteria";
        $this->tabulkauchazeci="uchazeci";
        $this->tabulkakomiseotevirani="komise_otevirani";
        $this->tabulkakomiseoteviranidata="komise_otevirani_data";
        $this->tabulkakomiseposuzovani="komise_posuzovani";
        $this->tabulkakomiseposuzovanidata="komise_posuzovani_data";
        $this->tabulkakomisevyber="komise_vyber";
        $this->tabulkakomisevyberdata="komise_vyber_data";
        $this->tabulkadodatky="dodatky";
        $this->tabulkasoubory="soubory";
        $this->password=$password;
        $this->login=$login;
        $this->dnesnidatum=time();
        $this->dnesnidatumstmp=date("YmdHis");


    }



    public function zakazka($login=NULL,$heslo=NULL,$zakazka=NULL){


    }

}
?>

ale nevím jak ji registrovat v presenteru:

<?php

namespace App\Presenters;

use Nette;
use App\Model\clKonektor;
use Nette\Utils\Callback;
use Nette\Application\UI\Form;
use Tracy\Debugger;


class SoapPresenter extends Nette\Application\UI\Presenter
{

    /** @var clKonektor */
    private $clKonektor;


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

    }


    public function renderDefault()
    {


    }

    public function actionDefault()
    {
        //info

        $adresarpozadavky = '../www/pozadavkytest';
        //pristupove udaje pro webovou sluzbu
        $loginWS="*******";
        $passwordWS="*******";


        $message = 'User '.$_SERVER['REMOTE_ADDR'].' connect Soap page at '.date("d.m.Y H:i:s");
        Debugger::log($message);


        set_time_limit(0);

        ini_set("display_errors","On");
        $handle = fopen("".$adresarpozadavky."/a".date("YmdHis",time())."d", 'a');
        fwrite($handle, "test".$GLOBALS['HTTP_RAW_POST_DATA']);
        fclose($handle);

        if(isset($GLOBALS['HTTP_RAW_POST_DATA'])){
            $handle = fopen("".$adresarpozadavky."/".date("YmdHis",time())."d", 'a');
            fwrite($handle, $GLOBALS['HTTP_RAW_POST_DATA']);
            fclose($handle);
        }

        ini_set("soap.wsdl_cache_enabled", "0");
        $server = new \SoapServer('/soap/wsdl');
        // Zaregistrujeme tridu pro obsluhu
        $server->setClass('clKonektor', $loginWS, $passwordWS);
        // Ulozime stav serveru do sessiony
        $server->setPersistence(SOAP_PERSISTENCE_REQUEST); // SOAP_PERSISTENCE_REQUEST, SOAP_PERSISTENCE_SESSION
        // Kdyz mame nejaky dotaz, tak odpovime, jinak konec
        if(isset($GLOBALS['HTTP_RAW_POST_DATA'])){
            $handle = fopen("".$adresarpozadavky."/".date("YmdHis",time())."d", 'a');
            fwrite($handle, $GLOBALS['HTTP_RAW_POST_DATA']);
            fclose($handle);
            $server->handle();
        }
        else{
            echo "SOAP server obsahuje tyto funkce: <br/>\n";
            $functions = $server->getFunctions();
            foreach($functions as $func) {
                echo $func . "<br/>\n";
            }
            exit;
        }



    }


}
?>

příkaz:

<?php
$server->setClass('clKonektor', $loginWS, $passwordWS);
?>

vypisuje chybu:

<?php
Warning
SoapServer::setClass(): Tried to set a non existent class (clKonektor)
?>

Editoval Allconius (11. 4. 2019 8:26)

David Matějka
Moderator | 6445
+
+1
-

Tu třídu máš v namespace, ale setClass voláš bez NS

Allconius
Člen | 313
+
0
-

super, funguje:

<?php
$server->setClass('App\Model\clKonektor', $loginWS, $passwordWS);
?>

moc díky !

Ondřej Kubíček
Člen | 494
+
+2
-

lepší by to bylo stejně zapsat jako ->setClass(clKonektor::class, ..., nikdy by ti to nehodilo tu chybu a kdybys třeba ty třídu přejmenovával, tak editor ti ji přejmenuje i tady, ten string by nechal původní

Allconius
Člen | 313
+
0
-

Ondřej Kubíček napsal(a):

lepší by to bylo stejně zapsat jako ->setClass(clKonektor::class, ..., nikdy by ti to nehodilo tu chybu a kdybys třeba ty třídu přejmenovával, tak editor ti ji přejmenuje i tady, ten string by nechal původní

ahoj, jj super upravil jsem:

<?php
 $server->setClass(clKonektor::class);
?>

akorát mám teď problém s voláním té služby:

<?php
$response = $client->__soapCall("zakazka", array("login", "heslo", $params));
?>

a stejně tak:

<?php
$response = $client->zakazka("login", "heslo", $params);
?>

mi hodí:
SoapFault
Internal Server Error

Ondřej Kubíček
Člen | 494
+
0
-

se podívej do logu co za server error tam je

Allconius
Člen | 313
+
0
-

Ondřej Kubíček napsal(a):

se podívej do logu co za server error tam je

ajo vlastně, je tam:
Recoverable Error: Argument 1 passed to App\Model\clKonektor::__construct() must be an instance of Nette\Database\Context, none given

ale nevím proč to , když argument 1 v konstruktoru je přece instance Nette\Database\Context ?, viz. clKonektor.php:

<?php

namespace App\Model;

use Nette;

class clKonektor
{

    use Nette\SmartObject;

    /** @var Nette\Database\Context */
    private $database;
    private $tabulka;
    private $tabulkakriteria;
    private $tabulkauchazeci;
    private $tabulkakomiseotevirani;
    private $tabulkakomiseoteviranidata;
    private $tabulkakomiseposuzovani;
    private $tabulkakomiseposuzovanidata;
    private $tabulkakomisevyber;
    private $tabulkakomisevyberdata;
    private $tabulkadodatky;
    private $tabulkasoubory;
    private $dnesnidatumstmp;
    private $dnesnidatum;
    private $login;
    private $password;
    private $adresarpozadavky;

    public function __construct(Nette\Database\Context $database)
    {
        $this->database = $database;
        $this->tabulka = "zakazky";
        $this->tabulkakriteria = "kriteria";
        $this->tabulkauchazeci = "uchazeci";
        $this->tabulkakomiseotevirani = "komise_otevirani";
        $this->tabulkakomiseoteviranidata = "komise_otevirani_data";
        $this->tabulkakomiseposuzovani = "komise_posuzovani";
        $this->tabulkakomiseposuzovanidata = "komise_posuzovani_data";
        $this->tabulkakomisevyber = "komise_vyber";
        $this->tabulkakomisevyberdata = "komise_vyber_data";
        $this->tabulkadodatky = "dodatky";
        $this->tabulkasoubory = "soubory";
        $this->login = "login";
        $this->password = "heslo";
        $this->adresarpozadavky = "../log/pozadavkytest";
        $this->dnesnidatum = time();
        $this->dnesnidatumstmp = date("YmdHis");


    }


    public function zakazka($login = NULL, $heslo = NULL, $zakazka = NULL)
    {
..........
?>
Ondřej Kubíček
Člen | 494
+
0
-

no jo ale jak se ten Context do constructoru dostane?

myslím že místo setClass() budeš muset použít setObject() a poslat tam instanci clKonektor sám

Allconius
Člen | 313
+
0
-

Ondřej Kubíček napsal(a):

no jo ale jak se ten Context do constructoru dostane?

myslím že místo setClass() budeš muset použít setObject() a poslat tam instanci clKonektor sám

aha zkusím ten setObject(), když jsem dal tu funkci napřímo tak to funguje:

<?php
$response = $this->clKonektor->zakazka("login", "heslo", $params);
?>

ale to už není SOAP :-)

Allconius
Člen | 313
+
0
-

Ondřej Kubíček napsal(a):

no jo ale jak se ten Context do constructoru dostane?

myslím že místo setClass() budeš muset použít setObject() a poslat tam instanci clKonektor sám

tak jsem to nastavil takto:

<?php
$server->setObject($this->clKonektor);
?>

ale klient:

<?php
 $response = $client->__soapCall("zakazka", array("login", "heslo", $params));
?>

mi vyhodi:

<?php
SoapFault
looks like we got no XML document
?>