Laravel Controller -> класс API - PullRequest
       6

Laravel Controller -> класс API

0 голосов
/ 23 октября 2018

Я борюсь с тем, как сделать это правильно, следуя рекомендациям.Это может быть сложно объяснить, но я постараюсь изо всех сил.

У меня есть внешний API, к которому мне нужно совершать очень много разных вызовов.Итак, на данный момент я создал класс в папке App под названием Api.php.Он использует Guzzle для вызовов API.

В Controller для представления я создаю объект Api в необходимых функциях и вызываю соответствующую функцию в классе API.

Controller

public function uploadDevice(Request $request)
{
  ## Validation etc is performed

  // Calling the API
  $api = new Api();
  $api->uploadDevice();
}

Api.php

class Api
{

    private $token;

    public function __construct(){}

    public function checkIfHasToken(){}

    public function getTokenFromSession(){}

    public function getFreshToken(){}

    public function uploadDevice(){}

}

Некоторые вопросы

  1. checkIfHasToken() необходимо вызывать перед каждым запросом.Должно ли это быть сделано в constructor, first in each function doing API calls или directly from the Controller?
  2. Исключения: где я должен делать Try / catch и т.д.?Должно ли это быть сделано в классе Api, где это необходимо, или в Controller, вызывая каждую функцию из класса API и заключая ее в try / catch?
  3. Перенаправления: я хочу перенаправить обратно в Route theзапрос пришел со всеми возможными ошибками или сообщением об успехе.Так что, если у меня есть попытка / отлов, я хочу перенаправить с включенным результатом улова.Где поставить эту логику?Перенаправление из вложенной функции, похоже, не работает.Итак, я вернулся к вызову каждой функции в классе Api из контроллера по одному и обрабатывал исключения / ошибки / проверки отдельно в контроллере?

Может быть, я тоже думаюмного об этом или сделать его более сложным, чем это должно быть.Не уверен больше.

Ответы [ 2 ]

0 голосов
/ 23 октября 2018
// Controller
public function __construct(ApiService $apiService)
{
    $this->api = $apiService;
}


public function uploadDevice(Request $request)
{
    // Ensure that the user has a token in a custom HTTP request or in a middleware somewhere
    try {
        $this->api->uploadDevice();
    }
    catch (Exception $exception){
        return redirect()->back();
        //You can include errors from $exception here.
    }
}

// Service
class ApiService
{

    public function uploadDevice()
    {
        return 'I did a thing';
    }

}

Объяснение

У Laravel есть много способов сделать то же самое, все зависит от того, что вам нужно и как вы хотите, чтобы ваше приложение масштабировалось.

Проверка наличия или правильности токена должна выполняться в промежуточном программном обеспечении.

Поймать попытку можно в любом месте, в зависимости от того, сколько вы должны увидеть в исключении, обычно в контроллере все нормально, но вы можете сделать это разными способами.Лично мне нравится делать прослушиватель событий для любой http-ошибки.

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

0 голосов
/ 23 октября 2018

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

Если это нужно вызывать для каждого запроса, я предлагаю сделать его промежуточным ПО, так как оно предназначено для этогоцель.

Исключения: где я должен делать попытку / ловить и т. д.?Должно ли это быть сделано в классе Api, где это необходимо, или в Controller, вызывая каждую функцию из класса API и заключая ее в try / catch?

Это зависит от того, хотите ли вы бытьвозможность контролировать выход при возникновении исключения, тогда вы, вероятно, хотите, чтобы оно было в вашем контроллере.Если вы можете запрограммировать что-то сделать, когда возникнет исключение (например, вернуть неудачно), сделайте это на более низком уровне (api).

Перенаправления: я хочу перенаправить обратно на маршрут, на который пришел запросс каждой возможной ошибкой или сообщением об успехе.Так что, если у меня есть попытка / отлов, я хочу перенаправить с включенным результатом улова.Где поставить эту логику?Перенаправление из вложенной функции, похоже, не работает.Итак, я вернулся к вызову каждой функции в классе Api из контроллера по одному и обрабатываю исключения / ошибки / проверки отдельно в контроллере?

Вы можете вернуться, вернувredirect()->back() в качестве ответа лучший способ показать ошибки - включить их куда-нибудь.Я предлагаю использовать session()->flash() для этого.Эти вызовы могут быть сделаны из try / catch.

...