2016-07-05 3 views
1

Повторные звонки - Допустим, вам нужно ваше приложение, чтобы поговорить с API, и вы используете жужжание или обертку или что-то еще. Мне приходится называть соединение в каждой функции контроллера, например:Laravel - Calling API соединения

class ExampleController extends Controller 
{ 

    public function one() 
    { 

     $client = new Client(); 
     $response = $client->get('http://', 
     [ 'query' => [ 'secret' => env('SECRET')]]); 

     $json = json_decode($response->getBody()); 
     $data = $json->object; 

     // do stuff 
    } 

    public function two() 
    { 
     $client = new Client(); 
     $response = $client->get('http://', 
     [ 'query' => [ 'secret' => env('SECRET')]]); 

     $json = json_decode($response->getBody()); 
     $data = $json->object; 

     // do stuff 
    } 
} 

Как мне лучше справиться с этим? Использовать ли я поставщика услуг? если да, то как мне лучше всего реализовать эти вызовы? Должен ли я создать другой контроллер и вызвать все мои соединения API в каждой функции, а затем включить этот контроллер и вызвать каждую функцию по мере необходимости? Должен ли я поместить его в __construct?

ответ

0

позволяет попробовать Dependency принцип инверсии

Ok это может показаться немного трудно на первый и мой код может иметь некоторые опечатки или незначительные ошибки, но попробуйте это

You необходимо создать интерфейс

namespace app\puttherightnamespace; // this deppends on you 

interface ExempleRepositoryInterface 
{ 
    public function getquery(); // if you passinga variable -> public function getquery('variable1'); 

} 

Теперь вы должны создать репозиторий

class ExempleRepository implements ExempleRepositoryInterface { 

public function getquery() { 

    $client = new Client(); 
    $response = $client->get('http://', 
    [ 'query' => [ 'secret' => env('SECRET')]]); 

    $json = json_decode($response->getBody()); 

    return $json->object; 
} 

Теперь последний шаг, чтобы связать интерфейс с репо в регистрового метода поставщика услуг

public function register() 
{ 
    $this->app->bind('namespacehere\ExempleRepositoryInterface', 'namespacehere\ExempleRepository'); 
    } 

Теперь каждый раз, когда вам нужно результат в контроллере все, что вам нужно сделать, это ineject

class ExempleController extends Controller { 
     private $exemple; 
     public function __construct(ExempleRepositoryInterface $home) { 
      $this->exemple = $exemple; 
     } 
     public function test() { 
      $data = $this->exemple->getquery();/you can pass a variable here if you want like this $this->exemple->getquery('variable'); 

      // do stuff 
     } 

Это не самый простой способ, но это лучший способ, я думаю,

+0

Большое вам спасибо! Это очень помогает мне. Пара вопросов. Куда бы я поместил интерфейс и репо в каталогах laravel? (в/контроллеры?) с поставщиком услуг, добавлю ли я это в свой файл AppServiceProvider? – panoply

+0

Нет, создайте другую папку внутри папки приложения (или за ее пределами) и разместите там репозитории, да, или вы можете добавить это поставщику услуг ur-приложения или создать нового поставщика услуг (кстати, вам придется отредактировать композитор.json для автозагрузки новая папка для работы) –