【问题标题】:Laravel - Action not defined but it is definedLaravel - 动作未定义但已定义
【发布时间】: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 是什么以及您的控制器文件中的更多内容。

标签: laravel controller laravel-blade


【解决方案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');

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

【讨论】:

    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2015-07-01
    • 2015-04-18
    • 2018-07-19
    • 2020-11-30
    • 2020-08-16
    • 2021-04-01
    • 1970-01-01
    相关资源
    最近更新 更多