Laravel覆盖了命名路线,并采取了错误的路线

时间:2014-03-17 23:43:47

标签: php laravel laravel-4

我在routes.php文件

中定义了这个
Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController@Login'));

Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController@RegistrarAdministrador'));

在我的login.blade.php文件中,表单以

开头
{{ Form::open(array('route'=>'Loguearse'))}}

我不知道为什么当我提交表单时采用第二条路线而不是第一条路线,即使我指向第一条路线。

必须有一种方法可以从两种不同的形式转到同一个网址,这就是我想要的。

3 个答案:

答案 0 :(得分:3)

如果您有两条路径具有完全相同的URI且方法相同:

Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController@Login'));

Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController@RegistrarAdministrador'));

当某些事情发生时,Laravel如何知道它们之间的区别?{/ 1}?

它总是假定第一个。

您设置的名称/gestionAdministrador将用于创建基于该路由名称的URL,仅当某些内容(浏览器,卷曲...)点击URL时,区分它们的唯一方法是

1)网址

2)网址参数(基本上是数字1加参数)

3)方法(GET,POST)

所以你可以将它们改为:

'as' => 'RegistrarAdministrador'

编辑2

您真正需要了解的是,您为路线命名的名称('as'=>'name')将不会成为您网址的一部分,因此这不是Laravel可以用来区分您的两个URls,仅供内部使用,用于在创建URL期间识别您的路由。那些,那些指示:

Route::post('gestionAdministrador/loguearse', array('as' => 'Loguearse', 'uses' => 'AdministradorController@Login'));

Route::post('gestionAdministrador/registrar', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController@RegistrarAdministrador'));

会生成完全相同的网址:

$loguearse = URL::route('Loguearse');
$registrar = URL::route('RegistrarAdministrador');

编辑1 - 回答评论

在Laravel中重定向很容易,在您的控制器中,在处理完表单后,您可以使用任何方法:

http://yourserver.dev/gestionAdministrador

return Redirect::to('/');

有这样一条路线:

return Redirect::route('home');

所以,你的控制器看起来像这样:

Route::get('/', array('as' => 'home', 'uses' => 'HomeController@index'));

答案 1 :(得分:3)

实际上你的路线集中只有一条路线,因为:

您声明了以下路线:

Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController@Login'));

Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController@RegistrarAdministrador'));

这两种方法都使用了post方法,这是post方法:

public function post($uri, $action)
{
    return $this->addRoute('POST', $uri, $action);
}

它会调用addRoute,现在是:

protected function addRoute($methods, $uri, $action)
{
    return $this->routes->add($this->createRoute($methods, $uri, $action));
}

此处$this->routes->add表示Illuminate\Routing\RouteCollection::add()add()方法调用addToCollections(),如下所示:

protected function addToCollections($route)
{
    foreach ($route->methods() as $method)
    {
        $this->routes[$method][$route->domain().$route->getUri()] = $route;
    }

    $this->allRoutes[$method.$route->domain().$route->getUri()] = $route;
}

$routes是一个数组(protected $routes = array();),很明显路由按methods(GET / POST等)分组,每种方法只有一个唯一{ {1}}可以使用,因为它是这样的:

URL

所以,在你的情况下,最后一个替换第一个,在这种情况下,你可以使用不同的方法使用相同的$routes['post']['someUrl'] = 'a route'; $routes['post']['someUrl'] = 'a route'; 声明两个路由,所以它将在不同的数组中,如下所示:< / p>

URL
  

必须有办法从两种不同的形式转到同一个网址

是的,有一种方法,只是您必须使用与表单操作相同的路线,因此,您不需要声明它两次。

答案 2 :(得分:1)

您想要做的是一个坏主意,您不应该登录并从同一路线注册。说到你说的话真的不可能。 Laravel的路线先到先得。基本上它检查路由,直到URI匹配一个,然后在控制器上调用该方法或执行回调。您的路线必须是路线文件中的另一种方式。这将通过更改网址来解决。