如何使用silex重定向到正确的页面?

时间:2017-11-05 23:41:59

标签: php .htaccess redirect routing silex

当我去http://www.example.com/new/index.php/login/时 (请注意/index.php/作为网址的一部分。) 成功登录后,我会重定向到http://www.example.com/new/welcome/ 那是对的。

但是登录屏幕网址不应该是/index.php/,因为这是Silex restapi。

但是当我尝试登录而没有/index.php/http://www.example.com/new/login/ 在这次登录后,我被重定向到new/index.php,而不是像上次那样重定向到/welcome/

请帮忙。

我的代码如下:

的index.php:

$app = Silex\Application;
$app->mount('/login', new Routers\Login());
$app->run();

路由器\ login.php中:

namespace Routers;
use Silex\Application;
use Silex\Api\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request ;

class Login implements ControllerProviderInterface
{
      public function connect(Application $app)
      {
      // creates a new controller based on the default route
      $controllers = $app['controllers_factory'];
      $controllers->get('/', 'Controllers\\Login::index');
      $controllers->post('/', 'Controllers\\Login::validate');

      return $controllers;

      }
}

控制器\ login.php中:

namespace Controllers;
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;


class Login {

      public function index(Request $request, Application $app) 
      {
             return $app['twig']->render('login.html');
      }


      public function validate(Request $request, Application $app) 
      {

             // validation goes here
             if ( // invalid ) {
                 return $app['twig']->render('login.html');
             } else {
                 // valid 
                 header("Location: /welcome");
                 exit;
             }
     }
}

htaccess的:

<IfModule mod_rewrite.c>
RewriteEngine On
# Send would-be 404 requests to Craft
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [QSA,L]
</IfModule>

编辑: 我想我发现了这个问题,登录表单是:

 <form method="post" action="index.php">

而不是将数据发布到http://www.example.com/new/login 那么动作网址必须如何?我尝试了action =“/ new / login”,但它不起作用。我没有POST /登录的路线。但是这是在Routers / Login.php中定义的,那我为什么要这个呢? 请指教。

EDIT2: 我如何在Routers \ Login.php中命名路由,因为我正在使用带有挂载的组织控制器

$controllers->get('/', 'Controllers\\Login::index');

它似乎不接受bind()?有组织的控制器是否支持命名路由器?

1 个答案:

答案 0 :(得分:1)

如果您想让silex为您找到合适的路线,

将名称绑定到路由声明:

$controllers->get('/', 'Controllers\\Login::index')->bind('login');

并在你的树枝模板中使用它

<form method="post" action="{{ path('login') }}">

它应该找到你需要的网址。