【问题标题】:Laravel overrides named route and takes wrong oneLaravel 覆盖命名路由并使用错误的路由
【发布时间】:2014-04-23 10:39:21
【问题描述】:

我在我的 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'))}}

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

必须有一种方法可以从两种不同的形式访问相同的 url,这就是我想要的。

【问题讨论】:

  • 为什么要注册两条相同的路线?这总是灾难的根源。
  • 它们并不相同。我只有两个表格,发布后转到相同的网址。一个首先执行登录方法,另一个在 AdministradorController 上执行 registrarAdministrador
  • domain.com/gestionAdministrador 有两条路由。你不应该。

标签: php laravel laravel-4


【解决方案1】:

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

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

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

当有东西碰到/gestionAdministrador时,Laravel 怎么知道它们之间的区别?

它总是假设第一个。

您设置的名称'as' => 'RegistrarAdministrador' 将用于基于该路由名称创建 URL,仅当某些东西(浏览器、curl...)点击该 URL 时,区分它们的唯一方法是通过

1) 网址

2) URL参数(基本上是1号加参数)

3) 方法(GET、POST)

因此您可以将它们更改为:

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

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

编辑 2

您真正需要了解的是,您给路由的名称 ('as' => 'name') 不会成为您的 url 的一部分,因此 Laravel 不能用它来区分您的两个 URl ,这仅供内部使用,用于在创建 URL 期间识别您的路由。所以,这些说明:

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

将生成完全相同的 URL:

http://yourserver.dev/gestionAdministrador

编辑 1 - 回复评论

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

return Redirect::to('/');

return Redirect::route('home');

有这样一条路线:

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

因此,您的控制器将如下所示:

class AdministradorController extends Controller {

    public function RegistrarAdministrador() 
    {
        ...

        return Redirect::route('home');
    }

    public function Login() 
    {
        ...

        return Redirect::route('home');
    }
}

【讨论】:

  • 那么为什么我可以在 laravel 中命名路由。我试图做的是在提交它们后从不同页面中的两个不同表单,重定向到相同的 url,这可能吗?
  • 是的,我想到了。但是很抱歉,如果我坚持但在提交两个不同的表单后是否有任何可能的方法可以重定向到完全相同的 url?
  • 如果我在提交到 /home 后想要在我的 web 上使用许多表单,没有任何可能的方法吗?
  • @AntonioCarlosRibeiro 我只是想在您的回复中补充一点,他错误地认为别名(即 AS =>'')是将某些 url 命名为不同,而实际上它只是为了能够反向路由从前端调用时自己。
【解决方案2】:

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

您声明了以下路线:

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 等)分组,并且在每种方法中,只有一个唯一的 URL 可用,因为它是这样的:

$routes['post']['someUrl'] = 'a route';
$routes['post']['someUrl'] = 'a route';

因此,在您的情况下,最后一个替换第一个,在这种情况下,您可以使用不同的方法使用相同的 URL 声明两条路由,因此它将位于不同的数组中,如下所示:

$routes['post']['someUrl'] = 'a route';
$routes['put']['someUrl'] = 'a route'; // Route::put(...)

一定有办法从两种不同的表单访问同一个url

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你是什么意思?它正在走第二条路线,我想走第一条路线。 Laravel 不检查名称。在表格中,我明确地放置了 Loguearse 表格。我试图做的是在提交它们重定向到相同的 url 后,来自不同页面中的两个不同表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2011-07-19
    • 2011-09-03
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多