【问题标题】:laravel 4 route not found - defaults to show methodlaravel 4 route not found - 默认显示方法
【发布时间】:2013-11-18 20:26:03
【问题描述】:

我已经完成了这项工作,但现在找不到路线,我不明白为什么。

在一个 javascript 函数中,我正在使用这个 url 向函数发送 ajax 帖子:

url: '/customers/storeajax',

在我的 routes.php 文件中,我有以下路由:

Route::post('customers/storeajax', array('as'=>'storeajax', 'uses' => 'CustomersController@storeAjax'));

Route::post('customers/updateajax/{id}', array('as'=>'updateajax','uses' => 'CustomersController@updateAjax'));


Route::resource('customers', 'CustomersController');

现在,当我尝试 POST 到 storeajax 路由时,我得到一个 ModelNotFoundException,这对我来说意味着找不到路由,因此它默认为默认的客户控制器显示方法 - 在错误日志中,我可以看到以下条目:

#1 [internal function]: CustomersController->show('storeajax')

确认将 storeajax 视为参数。

我已将我的附加路由置于默认资源路由之上

在我看不出哪里出错之前,我已经完成了这项工作。

此外,这些路线被放在一个组中:

Route::group(array('before' => 'sentryAuth'), function () {}

这只是确保用户已登录。测试虽然我已经在组外和文件顶部删除了,但它们仍然不起作用。

浏览器中的 url 正确显示为:http://greenfees.loc/customers/storeajax(我可以在 firebug 控制台中看到

我使用 POST 作为 ajax 方法 - 只是为了确认

谁能明白为什么这条路线行不通以及我错过了什么?

更新:

这是控制器内部的方法:

public function storeAjax()    
{        
$input = Input::all();    
$validation = Validator::make($input, Customer::$rules);    
if ($validation->passes())    
    {            
    $customer = $this->customer->create($input);            
    return $customer;        
    }    
return Redirect::route('customers.create')->withInput()
    ->withErrors(validation)            
    ->with('message', 'There were validation errors.');    
}

我有 99% 的把握,虽然我的路线没有到达此方法(我已经在方法中使用 vardump 进行了测试)并且问题与我的路线有关,但无法找到 customer/storeajax

我认为正在发生的事情是 customer/storeajax 在以 customer 开头的路由列表中找不到它然后默认为出现在列表中的资源路由并认为这是一个安静的请求并将其翻译为customer 路由默认使用 show 方法并使用 storeajax 作为参数,然后抛出错误 modelnotfoundexception 因为它找不到 ID 为“storeajax”的客户

这是日志的证据,详细说明了对上述 show 方法的调用。

因此,由于某种原因,我的“/customers/storeajax”路线无法找到,即使它看起来是有效的并且出现在客户资源之前。 modelnotfoundexception 是一个红鲱鱼,原因是当它找不到路由时,路由默认为客户的资源控制器。

【问题讨论】:

  • 尝试(在您的 JS 中):url: '{{URL::route("storeajax")}}',(假设您正在使用刀片)
  • 嗨。该脚本位于单独的脚本中,而不是刀片模板中,因此无法使用该方法?

标签: php laravel laravel-4 laravel-routing


【解决方案1】:

找不到路由会引发 NotFoundHttpException

如果你得到一个 ModelNotFoundException 是因为你的路由正在触发并且你的逻辑试图找到一个 Model,它不能以某种方式,它正在引发未找到错误。

你在使用FindOrFail()吗?这是引发此异常的方法示例。 BelongsToMany() 是另一个可能会提高它的人。

【讨论】:

  • 如果资源控制器存在,如果找不到像我这样的路由,它会尝试在资源控制器中找到restful方法-我确定资源路由需要出现在任何相关路由之后安宁以避免它接管。它将我的 url 视为 show 方法的一条宁静路线,然后提出模型未找到错误。如果我删除我的资源控制器作为测试,我会得到路由未找到错误只是为了确认假设。
  • 如果你删除了路由,然后得到一个找不到路由的错误,那是因为该路由之前工作正常。我的怀疑是CustomersController::storeAjax() 试图通过一种不存在的 Eloquent 关联方法来找到一个试图与不同模型关联的模型。向我们展示您的 Customer 模型以及 Customer 尝试关联的任何模型。
【解决方案2】:

我通过将控制器中的方法重命名为“newAjax”并将路由更新为:

Route::post('customers/new', array('as'=>'newajax','uses' => 'CustomersController@newAjax'));

我认为术语store 被系统使用(安静?)并产生意外行为。我在控制器中的许多其他功能中对其进行了测试 - 将术语 store 添加为方法的前缀,然后更新路由并在每次失败时更新。

学到了一些东西。

【讨论】:

  • 这似乎是一个依赖于环境的问题。在 Windows+PHP 5.4.16 上我没有问题。在 CentOS+PHP5.4.23 上,我遇到了同样的问题:Route::resource('tasks', 'TasksController'); 上的“PUT”运行 TasksController.show() 而不是 TasksController.update()。奇怪!
猜你喜欢
  • 1970-01-01
  • 2021-06-28
  • 2020-04-12
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
相关资源
最近更新 更多