Я использую Symfony 3 и пытаюсь получить доступ к классу, который я объявил в
SRC / AppBundle / Услуги / ApiEngine.php
namespace AppBundle\Service;use DateTime;
class ApiEngine {
private $api_handler;
public function __construct($username, bool $repos) {
$client = new \GuzzleHttp\Client();
$request = 'https://api.github.com/users/' . $username;
$request .= ($repos) ? '/repos' : "";
$res = $client->request('GET', $request);
$this->api_handler = json_decode($res->getBody()->getContents(), true);
}
public function getProfileData() {
return [ /*some data*/ ];
}
}
Я объявил этот файл в
конфиг / service.yml
service:
*
*
*
api:
class: AppBundle\Service\ApiEngine
arguments: ["@username", "@repos"]
В контроллере я пытаюсь использовать некоторые методы ApiEngine, как это:
SRC / AppBundle / Controller / GitApiController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class GitApiController extends Controller {
/**
* @Route("/{username}", name ="gitapi", defaults={"username": "symfony"})
*/
public function gitApiAction($username) {
$api = $this->get('api')->__construct($username, false)->getProfileData();
return $this->render('gitapi/index.html.twig', $api);
} }
Но это дает мне эту ошибку:
(1/1) ServiceNotFoundException Служба «API» зависит от
несуществующий сервис «имя пользователя».
Я советую вам изменить ваш класс, например:
private function __construct($username, bool $repos) {
$client = new \GuzzleHttp\Client();
$request = 'https://api.github.com/users/' . $username;
$request .= ($repos) ? '/repos' : "";
$res = $client->request('GET', $request);
$this->api_handler = json_decode($res->getBody()->getContents(), true);
}
public static function createApiEngine($username, bool $repos)
{
return new self($username, $bool);
}
После того, как внутри вашего контроллера вы можете сделать это:
$api = ApiEngine::createApiEngine($username, false);
$api->getProfileData();
В ваш контроллер нужно вставить use
за ApiEngine
В этом случае вам не нужно вводить зависимости, так что внутри services.yml
уберите аргументы пожалуйста
Других решений пока нет …