Я действительно новичок в фреймворках и ZF3, но мне нужно сделать API со следующей логикой. Я получаю параметры, сохраняю их в формате bd, и если в этот момент необходимо выполнить вызов (диспетчер вызовов), я отправляю его (вызывающему поставщику). Я смог выполнить первую и вторую части, но теперь я не знаю, как сделать последнюю … У меня есть следующий код:
IndexController.php
use Application\Service\CallManager;
use Application\Service\TropoCaller;
use Application\Service\NexmoCaller;class IndexController extends AbstractActionController
{
/**
* Entity manager.
* @var Doctrine\ORM\EntityManager
*/
private $entityManager;
/**
* Call manager.
* @var Application\Service\CallManager
*/
private $callManager;
/**
* Call manager.
* @var Application\Service\NexmoCaller
*/
private $NexmoCaller;
/**
* Call manager.
* @var Application\Service\TropoCaller
*/
private $TropoCaller;
/**
* Constructor is used for injecting dependencies into the controller.
*/
public function __construct($entityManager, $callManager, $NexmoCaller, $TropoCaller)
{
$this->entityManager = $entityManager;
$this->callManager = $callManager;
$this->NexmoCaller = $NexmoCaller;
$this->TropoCaller = $TropoCaller;
}
public function contactUSAction()
{
$form= new ButtoncallForm();
// Check whether this post is a POST request.
if ($this->getRequest()->isPost()) {
// Get POST data.
$data = $this->params()->fromPost();
// Fill form with data.
$form->setData($data);
if ($form->isValid()) {
// Get validated form data.
$data = $form->getData();
// Use post manager service to add new call to the database
$this->callManager->CallManager($data);return $this->redirect()->toRoute('application',
['action'=>'thankYou']);
}
}
return new ViewModel([
'form' => $form,
]);
}
public function thankYouAction()
{
return new ViewModel();
}
}
IndexControllerFactory.php
<?php
namespace Application\Controller\Factory;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\Service\CallManager;
use Application\Service\TropoCaller;
use Application\Service\NexmoCaller;
use Application\Controller\IndexController;
/**
* This is the factory for IndexController. Its purpose is to instantiate the
* controller.
*/
class IndexControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$entityManager = $container->get('doctrine.entitymanager.orm_default');
$callManager = $container->get(CallManager::class);
$NexmoCaller = $container->get(NexmoCaller::class);
$TropoCaller = $container->get(TropoCaller::class);
// Instantiate the controller and inject dependencies
return new IndexController($entityManager, $callManager, $NexmoCaller, $TropoCaller);
}
}
Мой CallManager.php
<?php
namespace Application\Service;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\ServiceManagerAwareInterface;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Application\Entity\CallRequested;
use Doctrine\ORM\EntityManager;
use Stomp\Client;
use Stomp\StatefulStomp;
use Stomp\Network\Connection;
use Stomp\Transport\Message;
use Application\Service\NexmoCaller;
use Application\Service\TropoCaller;
class CallManager
{
/**
* Doctrine entity manager.
* @var Doctrine\ORM\EntityManager
*/
private $entityManager;
/**
* @var Application\Service\NexmoCaller
*/
private $NexmoCaller;
/**
* @var Application\Service\TropoCaller
*/
private $TropoCaller;
// Constructor method is used to inject dependencies to the controller.
public function __construct($entityManager)
{
$this->entityManager = $entityManager;}
public function CallManager($data)
{
$callRequested= new CallRequested;
$callRequested-> setClientContact($data['clientContact']);
$callRequested-> setProvider($data['provider']);
$callRequested-> setCallCenter($data['callCenterContact']);
$whenCall= $data['schedule'];
$language= $data['language'];
$date = new \DateTime();
$callRequested-> setRequestTime($date);$provider=$data['provider'];
$tropo='Tropo';
//var_dump($data);$this->entityManager->persist($callRequested);
$this->entityManager->flush();
$id=$callRequested->getID();
//var_dump($callRequested->getID());
$data=array($id,$data);
$data=json_encode($data, true);
//confirmar onde usar esta lógica
if($whenCall==='1')
{ echo "Vamos establecer a ligaçao \n";
if (stripos($provider, $tropo) !== false) {$destination = '/queue/tropozend';
$messages = 1;
$size = 256;
$DATA = "calls";
$body = $data;try {
$connection = new Connection('tcp://192.168.64.3:61613');
$con1 = new StatefulStomp(new Client($connection));$con1->send($destination, new Message($body));
//echo "Message sent $body \n" ;
} catch(StompException $e) {
echo $e->getMessage();
// TropoCall();
}}
else{
$destination = '/queue/nexmozend';
$messages = 1;
$size = 256;
$DATA = "calls";
$body = $data;
try {
$connection = new Connection('tcp://192.168.64.3:61613');
$con1 = new StatefulStomp(new Client($connection));$con1->send($destination, new Message($body));
//echo "Message sent $body \n" ;} catch(StompException $e) {
echo $e->getMessage();
}
}
// NexmoCall();
}
else {echo "Vamos agendar a sua chamada \n";
}}
}
Я создал NexmoCaller и TropoCaller, но не знаю, как их назвать.
Вот один пример логики:
класс NexmoCaller
{
// public function __construct($NexmoCaller)
// {
// $this->NexmoCaller = $NexmoCaller;
// }public function NexmoCall()
{
$service= new NexmoCaller();
$serviceManager->set(NexmoCaller::class, $service);
$key = file_get_contents('scripts/application.key');
$basic = new \Nexmo\Client\Credentials\Basic($keyNexmo, $secret);
$keypair = new \Nexmo\Client\Credentials\Keypair($key, $application_id);
$client = new \Nexmo\Client(new \Nexmo\Client\Credentials\Container($basic, $keypair));
$jwt = generate_jwt($application_id, $key);header('Content-Type: application/json', 'Authorization: Bearer'.$jwt);
$destination = '/queue/nexmozend';$connection = new Connection('tcp://192.168.64.3:61613');
$stomp = new StatefulStomp(new Client($connection));
$stomp->subscribe($destination);echo "Waiting for messages...\n";
while(true) {
$frame = $stomp->read();
$body = $frame->getBody();
//echo($frame);
echo "message received $body \n";
//echo $stomp->read()->body, PHP_EOL;
//print_r($frame = $stomp->read());
//print_r($stomp->read()->body);
break;
}//codificar o json como é necessário
$json = json_decode($body, true);
var_dump($json);
}
}
Мой config.module.php
'controllers' => [
'factories' => [
Controller\IndexController::class => Controller\Factory\IndexControllerFactory::class,
],
],
'service_manager' => [
'factories' => [
Service\CallManager::class => Service\Factory\CallManagerFactory::class,
Service\NexmoCaller::class => InvokableFactory::class,
Service\TropoCaller::class => InvokableFactory::class,
],
],
Я попробовал несколько подходов, но ни один из них не создает менеджера и не вызывает его … Плюс, я не нашел ни одного случая использования сервиса внутри сервиса, поэтому я даже не уверен, что это возможно …
Одно из решений, которое я попробовал, было:
-строится в моем диспетчере вызовов:
/**
* Doctrine entity manager.
* @var Doctrine\ORM\EntityManager
*/
private $entityManager;
/**
* @var Application\Service\NexmoCaller
*/
private $NexmoCaller;
/**
* @var Application\Service\TropoCaller
*/
private $TropoCaller;
public function __construct($entityManager, $NexmoCaller,
$TropoCaller)
{
$this->entityManager = $entityManager;
$this->NexmoCaller = $NexmoCaller;
$this->TropoCaller = $TropoCaller;
}
И я получаю эту ошибку:
Слишком мало аргументов для функции Application \ Service \ CallManager :: __ construct (), 1 передано в /opt/lampp/htdocs/buttoncall/skeleton-application/module/Application/src/Service/Factory/CallManagerFactory.php в строке 15 и точно 3 ожидается
Или просто позвонив:
$this->NexmoCaller->NexmoCaller();
И получить это: вызов функции-члена NexmoCaller () на ноль
Я использовал ответ боже, на моей фабрике:
<?php
namespace Application\Service\Factory;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\Service\CallManager;
use Application\Service\NexmoCaller;
use Application\Service\TropoCaller;
class CallManagerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$entityManager = $container->get('doctrine.entitymanager.orm_default');
$nexmoCaller = $container->get(NexmoCaller::class);
$tropoCaller = $container->get(TropoCaller::class);
return new $requestedName(
$entityManager,
$nexmoCaller,
$tropoCaller
);}
}
И получить это: вызов функции-члена NexmoCaller () на ноль
Что я должен делать?
Из того, что я понимаю, вы пытаетесь использовать NexmoCaller и TropoCaller внутри CallManager, но вы их не вводили.
Вы находитесь на правильном пути создания конструктора:
public function __construct($entityManager, $NexmoCaller, $TropoCaller)
{
$this->entityManager = $entityManager;
$this->NexmoCaller = $NexmoCaller;
$this->TropoCaller = $TropoCaller;
}
Но в то время как вы ожидаете 3 параметра, ошибка говорит нам, что CallManagerFactory отправляет только 1.
Чтобы решить эту проблему, измените CallManagerFactory так, чтобы он выглядел примерно так:
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$entityManager = $container->get('doctrine.entitymanager.orm_default');
$nexmoCaller = $container->get(NexmoCaller::class);
$tropoCaller = $container->get(TropoCaller::class);
return new $requestedName(
$entityManager,
$nexmoCaller,
$tropoCaller
);
}
Других решений пока нет …