В Symfony2 при доступе к моему приложению локально через app_dev.php все работает нормально. Однако, когда я обращаюсь к app.php, это 404s:
К сожалению! Произошла ошибка
Сервер вернул «404 Not Found».
Что-то сломалось. Отправьте нам электронное письмо по электронной почте и сообщите нам, что вы делали, когда произошла эта ошибка. Мы исправим его как можно скорее. Извини за
- Обновление с symfony1 до symfony2
- Компонент Symfony3 Form, пытающийся передать значение null в тип намеченного метода в PHP 7
- Хранить PDF в базе данных MySQL
- Ошибка при попытке отправить электронную почту через Gmail с помощью SwiftMailer
- Symfony2 - Невозможно назначить роли для пользователя (массив ролей пуст)
Свежая установка symfony 2 не содержит никакой маршрутизации для производственной среды. Если вы посмотрите в app/config/routing_dev.yml
, вы заметите, что все маршруты, которые вы видите в демонстрационном приложении, определены только для разработки. Если вы хотите протестировать демо на app.php
, сначала нужно скопировать маршрутизацию с routing_dev.yml
в routing.yml
, а также включить AcmeDemoBundle
под вами AppKernel.php
:
$bundles = array( new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\SecurityBundle\SecurityBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Symfony\Bundle\MonologBundle\MonologBundle(), new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(), new Symfony\Bundle\DoctrineBundle\DoctrineBundle(), new Symfony\Bundle\AsseticBundle\AsseticBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(), + new Acme\DemoBundle\AcmeDemoBundle() } if (in_array($this->getEnvironment(), array('dev', 'test'))) { - $bundles[] = new Acme\DemoBundle\AcmeDemoBundle(); $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); }
(+ – строка, которую вы должны добавить, – это строка, которую вы должны удалить)
У меня была та же проблема, и я просто очистил кеш. php app/console cache:clear --env=prod
Это решило мою проблему.
Не $ kernel = new AppKernel ('prod', TRUE);
атрибут true: $ kernel = new AppKernel ('prod', TRUE);
он активирует режим отладки, и он не рекомендуется для продукта.
Имела та же проблема .
на самом деле может быть несколько вопросов. но вы должны очистить кеш с помощью команды console в качестве маршрутов кэширования symfony, шаблонов и config.
Это обычное кэширование Symfony, выполняющее свою работу. Любые сделанные вами изменения будут жить, чтобы увидеть / протестировать в app_dev.php (среда разработки), но не в app.php (производственная среда), поскольку он кэширует все.
Я следую простому правилу, которое работает. Каждый раз, когда я обновляю что-либо в app\config\routing.yml
(или любое изменение действительно), и я хочу увидеть его в процессе производства, вы должны ОСУЖДАТЬ CACHE , выполнив следующую консольную команду:
Symfony 2. *: php app/console cache:clear --env=prod
Symfony 3. *: php bin/console cache:clear --env=prod
Теперь попробуйте перезагрузить страницу в своем браузере, и вы увидите, что она работает.
Хорошо, у меня была такая же проблема, и очистка кеша не разрешила его. После часа чтения сообщений, где все говорят «ясный кеш», я решил по-настоящему понять, что происходит. Поэтому я попытаюсь объяснить другим людям, как я (кто только начал). Надеюсь, я не ошибаюсь, и если да, то, пожалуйста, поправьте меня.
Я предполагаю, что вы следуете учебнику книги, где у вас есть Acme/DemoBundle
. И доступ к нему из производственной среды дает вам 404
. Прежде всего, вы должны иметь четкое представление о том, что означает пакет Symfony. Это что-то вроде плагина. Это как головоломка. Symfony – это большая головоломка, и ваше приложение – часть головоломки.
Итак, во-первых, давайте посмотрим в файле ./app
в ./app
. То, что мы видим, регистрирует связки. Как положить кусочки головоломки. И сначала мы говорим «хорошо, я хочу основные части головоломки, пакеты Symfony», а затем мы говорим «и если я в режиме отладки, мне также нужны некоторые другие части». И есть ваша штука, ваш комплект. Вот почему вы не можете получить доступ к нему из производственной среды. Вы регистрируете только пакет из среды разработчика. Зарегистрируйте свой пакет ( Acme/DemoBundle/AcmeDemoBundle
) вверху, и вы можете получить доступ к нему из рабочей среды.
Во-вторых, перейдите в ./app/config/routing_dev.yml
. Это маршрутизация для среды разработки. Мы говорим «хорошо, у меня есть информация о маршрутизации в @AcmeDemoBundle/Resources/config/routing.yml
а в среде разработки наш пакет найден. Но посмотрите ./app/config/routing.yml
Мы не делаем что-то о нашей пользовательской маршрутизации. Это похоже на то, что Framework не знает о существовании нашего файла маршрутизации, и это в производственной среде. Поэтому добавление последней части routing_dev.yml
в routing.yml
(in ./app/config/
) должен устранить проблему.
После этого очистите кеш и проверьте, работает ли /app.php/random/[number]
. Должен быть.
Надеюсь, это поможет кому-то вроде меня, понимая некоторые основы.
Когда вы выполните ответ Антона и все еще получите ошибку, вы можете попробовать следующее:
В routing.yml
добавьте эти строки (только)
_welcome: pattern: / defaults: { _controller: AcmeDemoBundle:Welcome:index } _demo_secured: resource: "@AcmeDemoBundle/Controller/SecuredController.php" type: annotation _demo: resource: "@AcmeDemoBundle/Controller/DemoController.php" type: annotation prefix: /demo
не добавляйте эти строки
_assetic: resource: . type: assetic _wdt: resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" prefix: /_wdt _profiler: resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" prefix: /_profiler _configurator: resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml" prefix: /_configurator _main: resource: routing.yml
Это пример routing.yml
который я написал
# Internal routing configuration to handle ESI #_internal: # resource: "@FrameworkBundle/Resources/config/routing/internal.xml" # prefix: /_internal _welcome: pattern: / defaults: { _controller: AcmeDemoBundle:Welcome:index } _demo_secured: resource: "@AcmeDemoBundle/Controller/SecuredController.php" type: annotation _demo: resource: "@AcmeDemoBundle/Controller/DemoController.php" type: annotation prefix: /demo
Я должен согласиться с Эндрю.
Превращение второго AppKernel в TRUE позволяет только более четкое сообщение об отладке (и вы можете заметить, что приложение не быстрее, чем ожидалось).
В моем случае он сказал мне, что у меня не было доступного для производства маршрута (т. Е. Routing.yml).
Я должен был добавить следующие строки, как упоминается Misbah, и следовать другим обычным процедурам, чтобы мое приложение работало на полной скорости.
_welcome: шаблон: / defaults: {_controller: AcmeDemoBundle: Welcome: index}
Похоже, что вы неправильно настроили маршрутизацию.
Проверьте файл routing.yml
если он содержит маршрут по умолчанию для /
. Если нет, добавьте его в контроллер / действие, которое вы хотите запустить.
Ну, я нашел более простой и быстрый ответ:
first: $kernel = new AppKernel('prod', TRUE);
В файле app.php.
Затем, на вашем routing.yml (приложение / config / routing one, а не ваш пакет) просто удалите созданный по умолчанию код после объявления вашей маршрутизации.
_demo: resource: "@AcmeDemoBundle/Controller/DemoController.php"
type: annotation
prefix: /demo
Должен быть удален. После этого он работает без проблем!
измените свою среду на developmet, для использования маршрутов, сконфигурированных в routes_dev.yml
$ kernel = new AppKernel ('dev', true);
Отказ от ответственности: я абсолютно не знаком с Symfony.
Исходя из других фреймворков, казалось странным, что вы не можете отключить среду / отладку на основе текущих переменных среды (т.е. путь / домен).
Поэтому я переименовал app.php
в app_prod.php
и обновленный app.php
в следующее:
<?php if ($_SERVER['HTTP_HOST'] == 'localhost') { require_once 'app_dev.php'; } else { require_once 'app_prod.php'; }
Поэтому, если я запускаю код на своем локальном, он будет использовать dev, если я запустил его где-нибудь еще, он будет работать как производство. Вы можете, очевидно, добавить любые проверки, которые вы хотите, проверить для промежуточных / производственных / dev файлов пути вместо имен хостов.
Проблема меня много беспокоит, и вот мое решение: сначала измените строку 21 файла следующим образом:
$kernel = new AppKernel('prod', true);
то вы можете получать сообщения о проблемах при просмотре /app.php
на самом деле я сделал эти изменения, чтобы избежать ошибки «404»:
в appKernel.php: комментарий
$bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
Добавить
new Acme\DemoBundle\AcmeDemoBundle()
в нижней части функции registerBundles ();
Добавить
# AcmeDemoBundle routes (to be removed) _acme_demo: resource: "@AcmeDemoBundle/Resources/config/routing.yml"
to routing.yml
Простите, что я не знаю, как правильно использовать виджет кода. Но я надеюсь, что смогу вам помочь.