Разрешить косую черту для маршрута Symfony2 без параметров? - PullRequest
37 голосов
/ 20 марта 2012
acme_admin_dashboard:
    pattern:  /{_locale}/admin
    defaults: { _controller: AcmeBundle:Admin:dashboard }

Я хочу, чтобы этот маршрут был доступен в /en/admin и /en/admin/.Как бы я этого достиг?

Ответы [ 7 ]

36 голосов
/ 15 февраля 2013

Мне нравится ответ @ Kuchengeschmack (https://stackoverflow.com/a/11078348/593957), потому что он не вызывает внешние перенаправления.

Вот версия yaml:

acme_admin_dashboard:
    pattern:  /{_locale}/admin{trailingSlash}
    defaults: { _controller: AcmeBundle:Admin:dashboard, trailingSlash : "/" }
    requirements: { trailingSlash : "[/]{0,1}" }
20 голосов
/ 30 октября 2012

Просто введите:

/**
* @Route("/route/of/some/page/")
*/

, поэтому

www.example.com/route/of/some/page 

и

www.example.com/route/of/some/page/

принимаются ...

12 голосов
/ 18 июня 2012

Я нашел решение добавить косую черту в маршрут.

означает, что обе ссылки работают www.example.com/route/of/some/page и www.example.com/route/of/some/page/.Вы можете сделать это следующим образом:

если ваш маршрут выглядит как

/**
 * @Route("/route/of/some/page")
 */
public function pageAction() {

, измените его на

/**
 * @Route("/route/of/some/page{trailingSlash}", requirements={"trailingSlash" = "[/]{0,1}"}, defaults={"trailingSlash" = "/"})
 */
public function pageAction() {
10 голосов
/ 13 апреля 2012

Вы также можете просто использовать правило перезаписи в файле .htaccess:

Скажем, вы определили маршрут следующим образом:

news:
  url:   /news
  param: { module: news, action: index }

Это будет соответствовать http://something.something/news, но не http://something.something/news/ Вы можете добавить дополнительный маршрут с косой чертой, но вы также можете просто использовать это правило перезаписи в файле .htaccess:

RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

http://symfony -blog.driebit.nl / 2010/07 / url-маршруты-с-или-без-трейлинг-слеш /

6 голосов
/ 01 июня 2014

Я взломал следующую строку во фронт-контроллере (app.php / app_dev.php)

$_SERVER['REQUEST_URI'] = preg_replace('|/$|', '', $_SERVER['REQUEST_URI'], 1);

до $request = Request::createFromGlobals()

5 голосов
/ 10 февраля 2017

Маршрут:

 remove_trailing_slash:
        path: /{url}
        defaults: { _controller: AppBundle:Redirecting:removeTrailingSlash }
        requirements:
            url: .*/$
        methods: [GET]

Контроллер:

// src/AppBundle/Controller/RedirectingController.php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class RedirectingController extends Controller
{
    public function removeTrailingSlashAction(Request $request)
    {
        $pathInfo = $request->getPathInfo();
        $requestUri = $request->getRequestUri();

        $url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);

        return $this->redirect($url, 301);
    }
}

Подробнее: http://symfony.com/doc/current/routing/redirect_trailing_slash.html

1 голос
/ 25 марта 2016

Для новых версий SF:

По умолчанию компонент маршрутизации Symfony требует, чтобы параметры соответствовали следующему пути регулярных выражений: [^/]+. Это означает, что разрешены все символы, кроме /.

Вы должны явно разрешить / быть частью вашего параметра, указав более разрешительный путь регулярных выражений.

YAML:

_hello:
    path:     /hello/{username}
    defaults: { _controller: AppBundle:Demo:hello }
    requirements:
        username: .+

XML:

<routes xmlns="http://symfony.com/schema/routing"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="_hello" path="/hello/{username}">
        <default key="_controller">AppBundle:Demo:hello</default>
        <requirement key="username">.+</requirement>
    </route>
</routes>

PHP:

use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$collection = new RouteCollection();
$collection->add('_hello', new Route('/hello/{username}', array(
    '_controller' => 'AppBundle:Demo:hello',
), array(
    'username' => '.+',
)));

return $collection;

Аннотация:

/**
 * @Route("/hello/{username}", name="_hello", requirements={"username"=".+"})
 */
public function helloAction($username)
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...