Версии API Laravel — как обрабатывать общие функции между версиями?

Я использую Laravel 5 и создаю веб-сервис для приложения, которому требуется управление версиями API. Это структура папок, которую я нашел на разных веб-ресурсах.

/app
  /controllers
    /Api
      /v1
        /UserController.php
      /v2
        /UserController.php

Проблема в том, что в UserController есть много функций, которые, скорее всего, не изменятся в разных версиях, или какие-либо изменения могут быть применены к каждой версии. Например, есть функция logout, которая отправляет сообщение пользователю после выхода из системы. Если я скопирую эту функцию в каждый UserController, то любое незначительное изменение, скажем, изменение сообщения или что-то в этом роде, заставит меня изменить каждый UserController в разных версиях. В результате я решил создать BaseUserController и вставить туда общие функции, и каждый Usercontroller должен наследовать это. я имею в виду это

/app
  /controllers
    /Api
      /BaseUserController.php extends Controller.php
      /v1
        /UserController.php extends BaseUserController.php
      /v2
        /UserController.php extends BaseUserController.php

поэтому, если какой-либо версии необходимо реализовать свою собственную logout, она просто переопределяет свою родительскую функцию или для любого глобального изменения я меняю функцию в родительском.

Я хотел бы спросить вас, является ли это хорошей стратегией для реализации управления версиями API? а в чем проблема с этим?

заранее спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
414
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

/app
 /services
  /UserService.php

Опять же, это личное предпочтение, и оно работает для меня.

Как сказал @GreedChikara, это своего рода личный выбор... Моя структура выглядит следующим образом..

/app
  /controllers
    /Api
      /UserController.php
      /v2/
        /UserControllerV2.php

И что я делаю, чтобы уменьшить дублирование — всегда расширяю предыдущую версию и переопределяю методы, которые должны вести себя иначе, чем в предыдущей версии —

class UserControllerV2 extends UserController {


    /**
     * Create a new controller instance.
     */
    public function __construct() {

        parent::__construct();
    }

    ##Overridden methods.....
}

Другие вопросы по теме