Silex app- > перенаправление не соответствует маршрутам

Пусть мое приложение работает на localhost, путь:localhost/silex/web/index.php, определенные маршруты, как в коде ниже, я ожидал бы посещения localhost/silex/web/index.php/redirect редиректы Я localhost/silex/web/index.php/foo и отображает "foo". Вместо этого он перенаправляет меня на localhost/foo.

Я новичок в Silex, и, возможно, я все неправильно понял. Может кто-нибудь объяснить, в чем проблема? Правильно ли это поведение, и оно должно перенаправляться на абсолютные пути? Спасибо.

<?php

require_once __DIR__.'/../vendor/autoload.php';

use SymfonyComponentHttpFoundationResponse;

$app = new SilexApplication();

$app['debug'] = true;

$app->get('/foo', function() {
    return new Response('foo');
});

$app->get('/redirect', function() use ($app) {
    return $app->redirect('/foo');
});


$app->run();

3 ответов


на redirect url ожидает, что url-адрес для перенаправления, а не маршрут в приложении. Попробуйте так:

$app->register(new Silex\Provider\UrlGeneratorServiceProvider());

$app->get('/foo', function() {
    return new Response('foo');
})->bind("foo"); // this is the route name

$app->get('/redirect', function() use ($app) {
    return $app->redirect($app["url_generator"]->generate("foo"));
});

для внутренних перенаправлений, которые не изменяют запрошенный URL, вы также можете использовать подзапрос:

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;

$app->get('/redirect', function() use ($app) {
   $subRequest = Request::create('/foo');
   return $app->handle($subRequest, HttpKernelInterface::SUB_REQUEST, false);
});

см. также суб-запросов.


до "silex/silex": ">= 2.0", собственный признак позволяет создавать URL-адрес на основе имени маршрута.

вы можете заменить :

$app['url_generator']->generate('my-route-name');

By:

$app->path('my-route-name');

затем используйте его для перенаправления:

$app->redirect($app->path('my-route-name'));

другая возможность-создать пользовательский признак для прямого перенаправления с именем маршрута:

namespace Acme;

trait RedirectToRouteTrait
{
    public function redirectToRoute($routeName, $parameters = [], $status = 302, $headers = [])
    {
        return $this->redirect($this->path($routeName, $parameters), $status, $headers);
    }
}

добавьте черту в определение приложения:

use Silex\Application as BaseApplication;

class Application extends BaseApplication
{
    use Acme\RedirectToRouteTrait;
}

тогда используйте его там, где вам это нужно:

$app->redirectToRoute('my-route-name');