如何使用 silex 重定向到正确的页面?
How to get redirected to correct page with silex?
当我去http://www.example.com/new/index.php/login/
(请注意 /index.php/
作为 url 的一部分。)
成功登录后,我会重定向到 http://www.example.com/new/welcome/
这是正确的。
但是登录屏幕 url 不应该 /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();
Routers\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;
}
}
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= [QSA,L]
</IfModule>
编辑:
我想我发现了这个问题,登录表单是:
<form method="post" action="index.php">
而不是将数据发布到 http://www.example.com/new/login
那么url的动作一定是怎样的呢?我试过 action="/new/login" 但它不起作用。我没有找到 POST /login 的路线。但是这是在 Routers/Login.php 中定义的,所以我为什么要得到这个?
请指教
编辑2:
我如何在我的 Routers\Login.php 中命名路由,因为我使用的是有组织的控制器,安装方式类似于
$controllers->get('/', 'Controllers\Login::index');
好像不接受bind()?有组织的控制器是否支持命名路由器?
如果你想让silex为你找到合适的路线,
将名称绑定到您的路由声明:
$controllers->get('/', 'Controllers\Login::index')->bind('login');
并在你的树枝模板中使用它
<form method="post" action="{{ path('login') }}">
它应该会找到您需要的 url。
当我去http://www.example.com/new/index.php/login/
(请注意 /index.php/
作为 url 的一部分。)
成功登录后,我会重定向到 http://www.example.com/new/welcome/
这是正确的。
但是登录屏幕 url 不应该 /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();
Routers\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;
}
}
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= [QSA,L]
</IfModule>
编辑: 我想我发现了这个问题,登录表单是:
<form method="post" action="index.php">
而不是将数据发布到 http://www.example.com/new/login 那么url的动作一定是怎样的呢?我试过 action="/new/login" 但它不起作用。我没有找到 POST /login 的路线。但是这是在 Routers/Login.php 中定义的,所以我为什么要得到这个? 请指教
编辑2: 我如何在我的 Routers\Login.php 中命名路由,因为我使用的是有组织的控制器,安装方式类似于
$controllers->get('/', 'Controllers\Login::index');
好像不接受bind()?有组织的控制器是否支持命名路由器?
如果你想让silex为你找到合适的路线,
将名称绑定到您的路由声明:
$controllers->get('/', 'Controllers\Login::index')->bind('login');
并在你的树枝模板中使用它
<form method="post" action="{{ path('login') }}">
它应该会找到您需要的 url。