Я создал новый проект Symfony 3.4, используя:
composer create-project symfony/skeleton my-project
После этого я добавил следующие компоненты:
composer require twig
composer require annotations
composer require maker
И создал Контроллер:
php bin/console make:controller
Я добавил действие с маршрутом "легальный". Вот DefaultController:
<?php
namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
/**
* @Route("/", name = "homepage")
*/
public function index()
{
return $this->render('index.html.twig', [
'controller_name' => 'DefaultController',
]);
}
/**
* @Route("/legal", name = "legal")
*/
public function legal()
{
return $this->render('legal.html.twig', []);
}
}
Файл config / routes.yaml:
#index:
# path: /
# defaults: { _controller: 'App\Controller\DefaultController::index' }
И config / routes / annotations.yaml:
controllers:
resource: ../../src/Controller/
type: annotation
Когда я захожу на домашнюю страницу, никаких проблем, страница отображается. Но когда я пробую страницу / legal, у меня появляется 404:
Not Found - The requested URL /legal was not found on this server.
php bin/console debug:router показывает ожидаемое:
------------------ -------- -------- ------ --------------------------
Name Method Scheme Host Path
------------------ -------- -------- ------ --------------------------
homepage ANY ANY ANY /
legal ANY ANY ANY /legal
_twig_error_test ANY ANY ANY /_error/{code}.{_format}
------------------ -------- -------- ------ --------------------------
Я очистил кеш с помощью консольной команды и удалив содержимое каталога var / cache. Но все же 404.
Я новичок в 3.4. Любые идеи ? Спасибо...
А у тебя маршрут / работает?
Что делать, если вы используете Sensio \ Bundle \ FrameworkExtraBundle \ Configuration \ Route вместо Symfony \ Component \ Routing \ Annotation \ Route?
@jljohnstone: я обслуживаю сайт через Apache, а @Antoine Galluet: да, маршрут / работает. Я понял, что забыл .htaccess, который не создается автоматически Symfony / Flex (см. Мой ответ).




Вы загрузили пакет «Приложение» в AppKernel.php? Существует массив, в котором вы должны открыть и добавить AppBundle.php вашего пакета.
$bundles = [
/**lot of other bundles*//
new App\AppBundle()
]
Это должно выглядеть так
Спасибо, но в моем случае в этом нет необходимости, поскольку я не создавал AppBundle (весь исходный код находится непосредственно в каталоге /src/).
Похоже, вам нужно настроить RewriteBase с апач, так как проблема не в /
Возможно, файл .htaccess даже отсутствует, поскольку вы используете Symfony / flex, и он не добавляет его по умолчанию, как предыдущие редакции Symfony.
Проверьте эту страницу на настроить веб-сервер
.htaccess должен находиться внутри общей папки, и минимальная конфигурация для запуска вашего приложения под Apache:
<VirtualHost *:80>
ServerName domain.tld
ServerAlias www.domain.tld
DocumentRoot /var/www/project/public
<Directory /var/www/project/public>
AllowOverride All
Order Allow,Deny
Allow from All
</Directory>
# uncomment the following lines if you install assets as symlinks
# or run into problems when compiling LESS/Sass/CoffeeScript assets
# <Directory /var/www/project>
# Options FollowSymlinks
# </Directory>
ErrorLog /var/log/apache2/project_error.log
CustomLog /var/log/apache2/project_access.log combined
</VirtualHost>
Спасибо за ответ, он указал мне правильное направление; Я забыл .htaccess. Но важной частью были правила перезаписи для перенаправления всех запросов на index.php, поэтому я написал полный ответ.
Ну, как указал @Basel Issmail, Symfony / Flex не создает .htaccess, как это делал предыдущий установщик Symfony, и я забыл об этом.
У меня был минимальный файл конфигурации Apache:
<VirtualHost *:80>
DocumentRoot /path/to/my-project/public
ServerName myproject.localhost
<Directory /path/to/my-project/public>
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Итак, я создал файл .htaccess в /public/ (где находится файл index.php), и минимальная необходимая конфигурация выглядит примерно так:
<IfModule mod_rewrite.c>
RewriteEngine On
# Determine the RewriteBase automatically and set it as environment variable.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .? - [L]
# Rewrite all other queries to the front controller.
RewriteRule .? %{ENV:BASE}/index.php [L]
</IfModule>
Недостаточно было переписать все запросы (кроме существующих файлов, таких как активы) на index.php, чтобы Symfony могла обработать маршрут.
--- Редактировать ---
Вместо того, чтобы вручную создавать .htaccess, вы также можете просто использовать гибкий рецепт symfony:
composer require apache-pack
Это установит этот файл .htacess.
Возникла такая же проблема с установкой symfony на Synology DSM 6.2. Я подтверждаю, просто запустите "composer require apache-pack", как указано в scandel, и маршрутизация аннотаций будет работать отлично. Файл .htaccess с rewrite cond будет автоматически создан в "общедоступной" папке.
Спасибо ! :)
Вот файл .htaccess, созданный установкой symfony flex:
#----------------------------
# Use the front controller as index file. It serves as a fallback solution when
# every other rewrite/redirect fails (e.g. in an aliased environment without
# mod_rewrite). Additionally, this reduces the matching process for the
# start page (path "/") because otherwise Apache will apply the rewriting rules
# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
DirectoryIndex index.php
# By default, Apache does not evaluate symbolic links if you did not enable this
# feature in your server configuration. Uncomment the following line if you
# install assets as symlinks or if you experience problems related to symlinks
# when compiling LESS/Sass/CoffeScript assets.
# Options FollowSymlinks
# Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve
# to the front controller "/index.php" but be rewritten to "/index.php/index".
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
# Determine the RewriteBase automatically and set it as environment variable.
# If you are using Apache aliases to do mass virtual hosting or installed the
# project in a subdirectory, the base path will be prepended to allow proper
# resolution of the index.php file and to redirect to the correct URI. It will
# work in environments without path prefix as well, providing a safe, one-size
# fits all solution. But as you do not need it in this case, you can comment
# the following 2 lines to eliminate the overhead.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
# Sets the HTTP_AUTHORIZATION header removed by Apache
RewriteCond %{HTTP:Authorization} .
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect to URI without front controller to prevent duplicate content
# (with and without `/index.php`). Only do this redirect on the initial
# rewrite by Apache and not on subsequent cycles. Otherwise we would get an
# endless redirect loop (request -> rewrite to front controller ->
# redirect -> request -> ...).
# So in case you get a "too many redirects" error or you always get redirected
# to the start page because your Apache does not expose the REDIRECT_STATUS
# environment variable, you have 2 choices:
# - disable this feature by commenting the following 2 lines or
# - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
# following RewriteCond (best solution)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
# If the requested filename exists, simply serve it.
# We only want to let Apache serve files and not directories.
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
# Rewrite all other queries to the front controller.
RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>
<IfModule !mod_rewrite.c>
<IfModule mod_alias.c>
# When mod_rewrite is not available, we instruct a temporary redirect of
# the start page to the front controller explicitly so that the website
# and the generated links can still be used.
RedirectMatch 307 ^/$ /index.php/
# RedirectTemp cannot be used instead
</IfModule>
</IfModule>
#----------------------------
Вы используете встроенный PHP-сервер или обслуживаете его через Apache?