У меня проблема с последней версией Symfony 4.1
Я только начинаю работать с последней версией Symfony. В прошлый раз, когда я использовал Symfony, он все еще был в версии 2.8
В любом случае, моя проблема в том, что Symfony возвращает 404 на любом маршруте, отличном от первого маршрута моего DefaultController.
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
class DefaultController
{
public function index()
{
return new JsonResponse(['world'], Response::HTTP_OK);
}
public function show($slug)
{
return new JsonResponse(['slug' => $slug], Response::HTTP_OK);
}
}
Это мой конфиг / rout.yaml:
index:
path: /
controller: App\Controller\DefaultController::index
condition: "context.getMethod() in ['GET']"
blog_show:
path: /blog/{slug}
controller: App\Controller\DefaultController::show
condition: "context.getMethod() in ['GET']"
Посещая localhost, возвращает ответ ['world']
, как и ожидалось, и если я изменю это слово, ответ также изменится.
Однако, когда я пытаюсь нажать на URL http://localhost/blog/iliketacos
, я получаю ошибку 404.
Если я запускаю отладчик маршрута php bin/console debug:router
, я получаю следующую таблицу:
-------------------------- -------- -------- ------ -----------------------------------
Name Method Scheme Host Path
-------------------------- -------- -------- ------ -----------------------------------
_twig_error_test ANY ANY ANY /_error/{code}.{_format}
_wdt ANY ANY ANY /_wdt/{token}
_profiler_home ANY ANY ANY /_profiler/
_profiler_search ANY ANY ANY /_profiler/search
_profiler_search_bar ANY ANY ANY /_profiler/search_bar
_profiler_phpinfo ANY ANY ANY /_profiler/phpinfo
_profiler_search_results ANY ANY ANY /_profiler/{token}/search/results
_profiler_open_file ANY ANY ANY /_profiler/open
_profiler ANY ANY ANY /_profiler/{token}
_profiler_router ANY ANY ANY /_profiler/{token}/router
_profiler_exception ANY ANY ANY /_profiler/{token}/exception
_profiler_exception_css ANY ANY ANY /_profiler/{token}/exception.css
index ANY ANY ANY /
blog_show ANY ANY ANY /blog/{slug}
-------------------------- -------- -------- ------ -----------------------------------
Я также могу успешно сопоставить маршрут в консоли:
php bin/console router:match /blog/iliketacos
[OK] Route "blog_show" matches
+--------------+---------------------------------------------------------+
| Property | Value |
+--------------+---------------------------------------------------------+
| Route Name | blog_show |
| Path | /blog/{slug} |
| Path Regex | #^/blog/(?P<slug>[^/]++)$#sD |
| Host | ANY |
| Host Regex | |
| Scheme | ANY |
| Method | ANY |
| Requirements | NO CUSTOM |
| Class | Symfony\Component\Routing\Route |
| Defaults | _controller: App\Controller\DefaultController::show |
| Options | compiler_class: Symfony\Component\Routing\RouteCompiler |
+--------------+---------------------------------------------------------+
Кэш очищался несколько раз, я даже очищал его вручную (удаляя каталоги dev
и prod
)
Я запускаю свое приложение Symfony в контейнере Docker с пользователем root, если это имеет значение.
Почему мой браузер не может получить правильный ответ от Symfony, но все инструменты Symfony определяют, что все должно быть хорошо?
РЕДАКТИРОВАТЬ: Docker вещи (ни один из этих учетных данных не являются учетными данными Prod, так что не беспокойтесь)
version: '3'
services:
daracatum_db:
image: mysql:5.7
volumes:
- ./db:/var/lib/mysql
- ./db_init:/docker-entrypoint-initdb.d
restart: always
environment:
MYSQL_ROOT_PASSWORD: tYAQORgNyV
MYSQL_DATABASE: daracatum_backend
MYSQL_USER: daracatum
MYSQL_PASSWORD: tdAY8zKfkz
ports:
- "3306:3306"
daracatum_app:
depends_on:
- daracatum_db
image: php:7.2-apache
ports:
- "80:80"
restart: always
environment:
DB_HOST: daracatum_db:3306
DB_USER: daracatum
DB_PASSWORD: tdAY8zKfkz
APP_ENV: dev
APP_SECRET: 2e812144275b4979c2ef671ee72f7148
DATABASE_URL: mysql://db_user:db_password@127.0.0.1:3306/db_name
MAILER_URL: null://localhost
volumes:
- ./app:/var/www
- ./app/public:/var/www/html
- ./scripts:/scripts
Затем я запускаю SSH в экземпляр и запускаю этот скрипт:
#!/bin/bash
# ./scripts/composer.sh
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/bin/composer
chmod +x /usr/bin/composer
apt-get update
apt-get install -y git zip unzip
cd /var/www/
composer install
composer require annotations