Могу ли я позвонить в службу внутри службы в zf3?

Я действительно новичок в фреймворках и 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 () на ноль

Что я должен делать?

1

Решение

Из того, что я понимаю, вы пытаетесь использовать 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
);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]