Registrace třídy v SOAP pomocí setClass
- Allconius
- Člen | 317
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)
- Ondřej Kubíček
- Člen | 494
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 | 317
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
- Allconius
- Člen | 317
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
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 | 317
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žítsetObject()
a poslat tam instanciclKonektor
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 | 317
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žítsetObject()
a poslat tam instanciclKonektor
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
?>