Laravel - 动作未定义但已定义

Posted

技术标签:

【中文标题】Laravel - 动作未定义但已定义【英文标题】:Laravel - Action not defined but it is defined 【发布时间】:2018-11-09 05:50:35 【问题描述】:

当我尝试加载 Blade.php 时出现此错误

Action App\Http\Controllers\InventoryItemController@change not defined. 

我在 InventoryItemController 中有更改功能

    public function change($new_status)

        //  

当我想制作按钮时就开始了

<a href="action('InventoryItemController@change', $inventoryitem['new_status'])"class="btn btn-info">Confirm Change</a>

当我制作“编辑”按钮并且该按钮正常工作时,我所做的一切都是一样的。

更新 1

我的按钮现在是这样的

<a href="route('change', [$inventoryitem['new_status'], 
$inventoryitem['asset_id']])"class="btn btn-info">Confirm Change</a>

而我的改变功能是这样的

public function change($new_status, $asset_id) 
    
        $asset = Asset::find($asset_id);
        $asset->status = $new_status;
        return redirect('showasset', compact('asset','asset_id'));  
    

我在网络中的路线是这样的

Route::get('change/$new_status/$asset_id','InventoryItemController@change')->name('change');

但是在我单击按钮后,它只是将我重定向到 url .../change/4/1 就是这样。没有任何变化。

【问题讨论】:

你的路线是什么?使用route 而不是action 我的错,不要正确理解你的代码。一般来说,使用路线而不是行动更好。我可以看到控制器(不仅仅是方法)吗?您将控制器文件存储在哪里? 您传递的参数应该类似于 ['new_status' => $inventoryitem['new_status']] 或类似的东西,具体取决于您的代码 @DessaugesAntoine 如果我把路线而不是行动放在同一件事上,路线未定义。控制器文件是每个控制器文件所在的位置,在 app/http/Controllers/ @NoOorZ24 我需要传递 new_status 所以在我的更改函数中我可以更改另一个表中某些项目的状态。 @Zolak94 只是为了确定。在这种情况下,我们知道查看 $inventoryitem 是什么以及您的控制器文件中的更多内容。 【参考方案1】:

在 Laravel 中不推荐使用 Action

您可以改用路线。

在你的路由文件 (/routes/web.php) 中定义路由。

Route::get('change/status','InventoryItemController@change')->name('change');

然后在你的视野中

<a href="route('change', $inventoryitem['new_status'])"class="btn btn-info">Confirm Change</a>

在您的控制器中使用。

public function change ($status)
  // rest of the function.

希望对你有帮助

【讨论】:

我需要传递参数来改变功能。这样它只会将我重定向到 /change 页面。我没有。我需要的是按钮,单击该按钮会更改另一个表中项目的状态。 查看更新后的答案Route::get('change/status','InventoryItemController@change')-&gt;name('change'); 现在我收到此错误Missing required parameters for [Route: change] [URI: change/status]. @Zolak94 在您的更改更改功能中,您可以通过将其作为参数传递来获取新状态。查看我的更新答案 您的示例中没有函数名称,但仍然是相同的错误。【参考方案2】:

在路由文件中定义控制器的方法如下:

Route::get('url/new_status',InventoryItemController@change);

更新 1 的答案

    public function change($new_status, $asset_id) 
    
        $asset = Asset::find($asset_id);
        $asset->status = $new_status;
        $asset->save();     
        return view('your_view_path',compact('variable1','variable2'));
    

【讨论】:

我将返回重定向更改为返回视图,但它仍然转到此 url .../change/4/1(我放 ... 因为我的网站安全) 作为提示:如果您想将其返回到“确认更改”按钮所在的页面..您可以执行 return redirect()->back() 而不是返回视图。 请确保您的项目中有 showasset.blade.php 我确实有,但问题是当我从控制器调用方法时,它什么也不做,就像那个方法中什么都没有。【参考方案3】:

最终错误出现在我的路线中

Route::get('change/$new_status/$asset_id','InventoryItemController@change')->name('change');

应该是这样的

Route::get('change/new_status/asset_id','InventoryItemController@change')->name('change');

更改之后,一切都完美无缺。谢谢你们的帮助!

【讨论】:

以上是关于Laravel - 动作未定义但已定义的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 中未定义动作 Controller@store 的问题

单元测试反应动作 - browserHistory 未定义

未定义索引(Laravel)

Laravel Vue Axios 未定义

Laravel 6未定义变量:工作

未找到 Laravel 5.8 自定义命令