Я использую 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? а в чем проблема с этим?
заранее спасибо






Да, то, что вы сделали, является одним из многих решений этой проблемы. Лично я предпочитаю использовать сервисный уровень, который содержит большую часть общей логики, которую можно использовать из разных точек приложения.
/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.....
}