Не могу сконфигурирвать Yii2 под rest. Всегда дает 404
У меня один контроллер CategoryController и одна модель Category.
Вот контроллер
<?php
namespace api\controllers;
use yii\rest\ActiveController;
class CategoryController extends ActiveController
{
public $modelClass = 'api\models\Category';
}
Вот модель
<?php
namespace api\models;
use Yii;
/**
* This is the model class for table "{{%category}}".
*
* @property int $id
* @property string $slug
* @property string $title
* @property int $enabled
*
*/
class Category extends \yii\db\ActiveRecord
{
/**
* {@inheritdoc}
*/
public static function tableName()
{
return '{{%category}}';
}
/**
* {@inheritdoc}
*/
public function rules()
{
return [
['enabled', 'default', 'value' => 0],
[['title'], 'required'],
[['enabled'], 'integer'],
[['slug', 'title'], 'string', 'max' => 255],
[['slug'], 'unique'],
];
}
}
Моя конфигурация приложения (main.php из папки конфигов):
<?php
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/params-local.php'
);
return [
'id' => 'app-frontend',
'basePath' => dirname(__DIR__),
'language' => 'ru-RU',
'bootstrap' => ['log'],
'controllerNamespace' => 'api\controllers',
'components' => [
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
],
'request' => [
'parsers' => [
'application/json' => yii\web\JsonParser::class
]
],
'response' => [
'class' => yii\web\Response::class,
'format' => 'json'
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => false,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => 'category',
]
],
],
],
'params' => $params,
];
Общая структура приложения:
Запускаю я это следующим образом. Перехожу в папку web в приложении api и набираю
$ php -S localhost:8900
Результат перехода по урлу http://localhost:8900/categories :
{"name":"Not Found","message":"Страница не найдена.","code":0,"status":404,"type":"yii\\web\\NotFoundHttpException","previous":{"name":"Invalid Route","message":"Unable to resolve the request \"\".","code":0,"type":"yii\\base\\InvalidRouteException"}}
Пробовал запускать из докера.
Вот мой docker-compose:
version: '3.2'
services:
api:
build: api
ports:
- 22080:80
volumes:
# Re-use local composer cache via host-volume
- ~/.composer-docker/cache:/root/.composer/cache:delegated
# Mount source-code for development
- ./:/app
frontend:
build: frontend
ports:
- 20080:80
volumes:
# Re-use local composer cache via host-volume
- ~/.composer-docker/cache:/root/.composer/cache:delegated
# Mount source-code for development
- ./:/app
backend:
build: backend
ports:
- 21080:80
volumes:
# Re-use local composer cache via host-volume
- ~/.composer-docker/cache:/root/.composer/cache:delegated
# Mount source-code for development
- ./:/app
mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=verysecret
- MYSQL_DATABASE=yii2advanced
- MYSQL_USER=yii2advanced
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_HOST=%
ports:
- 3306:3306
И докер файл для проекта api:
FROM yiisoftware/yii2-php:7.2-apache
# Change document root for Apache
RUN sed -i -e 's|/app/web|/app/api/web|g' /etc/apache2/sites-available/000-default.conf
Тот же результат. Таблица category заполнена. Что же не так? Помогите, пожалуйста, задолбался уже (((
Ответы (1 шт):
В общем, ничего сложного. Если разрабатываете копипастой приложений, как я, (был frontend, я скопировал и переименовал в api), не забудьте обновить common/config/bootstrap.php. Как уже сказал, мое новое приложение называется api, а мой bootstrap.php выглядит:
<?php
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
Yii::setAlias('@api', dirname(dirname(__DIR__)) . '/api');
Вот, если кого то интересуют подробности поиска https://github.com/yiisoft/yii2/issues/18087
