Я знаю, что этот вопрос обсуждался здесь миллион раз, но я уже третий день бьюсь над этим вопросом.
У меня есть приложение Symfony, разработанное на моем локальном ПК (Windows). Теперь я пытаюсь развернуть его на своем веб-хостинге Linux (Linux).
Мои маршруты инициируются в классах контроллеров через аннотации.
<?php
namespace App\Controller;
use App\Entity\Category;
use App\Repository\CategoryRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class IndexController extends AbstractController
{
/**
* @Route("/", name = "app_index")
*/
public function index(): Response
{
return $this->render('index/index.twig', [
'controller_name' => 'IndexController'
]);
}
}
Проблема в том, что эти маршруты по какой-то причине не включены, что приводит к ошибке 404.
/config/services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
...
/config/маршруты/аннотации.yaml
controllers:
resource: ../../src/Controller/
type: annotation
prefix:
ru: '' # don't prefix URLs, the default locale
en: '/en'
kernel:
resource: ../../src/Kernel.php
type: annotation
/config/routes.yaml пуст
symfony console debug:router показывает только маршруты администратора и профилировщика, но не мои, инициированные в контроллерах
Буду очень признателен, если вы поможете мне решить эту проблему.
Если я опишу индексный маршрут в route.yaml (что мне не нравится.. Для чего тогда аннотации?)
index:
path: /
controller: App\Controller\IndexController::index
Симфони сходит с ума
"App\Controller\IndexController" has no container set, did you forget to define it as a service subscriber?
Все, что я сделал во время развертывания, было:
А no container set — это совсем другое дело. Это просто означает, что ваши службы контроллера не подключены должным образом. Еще раз посмотрите, что есть в новом проекте 5.4, это должно помочь. Даже после того, как вы определите свои маршруты с помощью аннотаций, ошибка службы будет продолжаться. Начинаете подозревать, что вы пытаетесь обновить свое приложение, а также перенести его на Linux.
Эй, Церад! Annotations.yaml существует, я только что добавил его содержимое в вопрос. p.s. Я добавил symfony/apache-pack - без него даже маршруты профайлера не резолвятся p.p.s. Я обновил оба проекта во время этой борьбы, они вроде все одинаковые
Итак, я не понял, что это проблема развертывания, хотя вы сказали это в своем вопросе. Вам необходимо следовать документации для вашего конкретного развертывания. Все может пойти не так. Убедитесь, что вы создали кеш для производства. И в производстве не будет никаких более профилирующих вещей.





Я надеюсь, что в service.yaml включена автоматическая проводка.
services:
# default configuration for services in *this* file
_defaults:
autowire: true # Automatically injects dependencies in your services.
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
И, пожалуйста, прокомментируйте код в route.yaml
И попробуйте с командой php bin/console cache:clear.
эй, спасибо за ваш отзыв! Да, включено (обновил пост). кеш: очистка не помогает :(
@Bhavin Рад, что я не единственный, кто неправильно понял вопрос. Может показаться, что это приложение отлично работает на машине разработки, но не очень хорошо при развертывании. Симптомы очень странные. И ОП, кажется, странно неохотно раскрывает какие-либо подробности о том, как они развертываются, за исключением используемой операционной системы.
Ну, я не понимаю, что здесь действительно важно, потому что я новичок в symfony. Добавлены этапы депоймента. Причина, по которой я рассказал только о dev и prod системах, состоит в том, что этих предпринятых мной шагов было достаточно, чтобы сделать рабочую копию веб-приложения на той же машине dev.
попробуйте с атрибутами PHP 8
#[Route('/', name: 'app_index')]
функция:
#[Route('/', name: 'app_index')]
public function index(): Response {
return $this->render('index/index.twig');
}
Документация:
https://www.php.net/manual/fr/language.attributes.overview.php
Большое спасибо. Это действительно помогло. У меня был PHP 7.4 на моем рабочем сервере. Обновил его до PHP8 и переписал маршруты в стиле атрибутов. Наконец это работает.
С удовольствием
Убедитесь, что файл
config/routes/annotations.yamlсуществует. Это то, что говорит Symfony сканировать каталог вашего контроллера на наличие аннотированных маршрутов. Если его нет, создайте новый проект 5.4 и скопируйте из него файл.