Ivanoff-i: вы уже сами себе ответили. Придется писать свой глобальный ErrorHandler умеющий менять формат в зависимости от запрошенного адреса. Можно еще до кучи Request::resolve переписать, что бы он кидал не только NotFoundHttpException, но и какой-нибудь ApiNotFoundHttpException, а в ErrorHandler его потом обрабатывать, что бы за данными маршрута лишний раз не ходить.
rest-controller ждет json с данными. Скорее всего, вы не в том формате их отправляете. Убедитесь, что у вас проставлен правильный content type и данные передаются именно как Json. prntscr.com/bqc73a
Вот это (int) \Yii::$app->request->get('start') ? (int) \Yii::$app->request->get('start') : 0; можно писать как (int) \Yii::$app->request->get('start', 0)
Кроме предложенных вариантов, вам не обязательно использовать один репозиторий во всех частях приложения, в отдельном модуле можно иметь репозиторий имеющий только необходимые для этого модуля методы. Если при этом все равно получается мега объект с кучей методов, возможно вам нужно разделить на модули использующий его код.
1. Разработка где хотите, хоть на виртуалке, хоть прямо на своей машине.
2. Базу менять только через миграции (хотя бывают исключения, но они очень редкие). Миграции нужны в том числе для автоматизации деплоя.
3. Деплой через специализированные продукты типа Capristrano. Обычно при этом создается отдельная папка на каждый релиз и при желании можно быстро откатиться.
Вы уверены, что это является узким местом? FileCache точно так же будет сохранять данные на диск и считывать их оттуда при каждом обращении + затраты на сериализацию/десериализацию.
Скажу только за JWT. Вам нужна серверная часть, которая будет генерировать токен. В токен нужно положить ID пользователя. По этому ID при следующем обращении вы сразу же узнаете, что это за пользователь. Остальное - на ваше усмотрение. JWT не шифрует информацию, только подписывает, так что никакой приватной информации в нем быть не должно.