【问题标题】:Laravel too few arguments to function,0 passed andexactly 2 expectedLaravel 函数的参数太少,传递了 0 个,预期的正好 2 个
【发布时间】:2021-03-21 21:46:26
【问题描述】:

【问题讨论】:

  • 您正在使用Route::resource,但想在Controller 中访问来自index method 的变量,为什么?
  • public function index($debate, $argument) 需要 2 个路由参数,但是资源控制器的 index 路由不接受任何参数。为资源控制器创建的路由列表位于laravel.com/docs/8.x/controllers#resource-controllers
  • @Al-AminSarker 我实际上并不知道 index 方法并不意味着采用变量,如果我将控制器更改为不是资源控制器,我将在路由中写入什么来访问页面和我会在刀片中写什么来发送变量?
  • 因此,如果您不使用Route::resource,则需要将Route 更改为您的slugs。然后你就可以访问这些变量了。
  • @Al-AminSarker 我已将路线更改为带有 slugs 的路线:Route::get('/attack/{debate}{argument}', 'AttackController@schemes');我还将控制器更改为不是资源控制器。请让我知道如何在 href 中写入以现在重定向到此路由并发送两个变量 $debate->id 和 $argument->id。非常感谢您的帮助

标签: php laravel parameters controller


【解决方案1】:

刀片文件

<a href="{{route('search',[$debate->id,$argument->id])}}" class="card-link">Is the circumstance: <strong>{{$variables->circumstance}}</strong> true?</a>

路线文件

Route::group(['middleware' => 'auth'], function () {
    Route::get('/attack/{debate}/{argument}', 'AttackController@schemes')->name('search');
});

控制器

public function schemes($debate, $argument){
   dd($debate, $argument);
}

【讨论】:

  • 尝试了上面的代码,现在出现错误:目标类 [AttackController] 不存在。我在 web 文件中有控制器的 Use 语句,我正在使用 Laravel 8。
  • 您的目录中没有 AttackController 类以正确的方式。所以,你需要改变它。
  • 抱歉,我不确定我是否理解,我该怎么做?
  • 使用此命令创建新控制器,例如php artisan make:controller YourController,并用此控制器替换Route 文件。看看进展如何……
  • 我的 AttackController 确实存在,但我不确定为什么会出现此错误
【解决方案2】:

如果您只在控制器中使用一种方法,则不需要资源路由,更好的方法是创建这样的单个路由:

Route::get('attack/{debate}/{argument}', 'AttackController@index')->middleware('auth')->name('attack.index');

大括号中的参数称为route parameters。现在,为了传递这个参数,你需要像 key => value 数组一样传递它们

  <a href="{{route('attack.index',['debate' => $debate->id,'argument' => $argument->id])}}" class="card-link">Is the circumstance: <strong>{{$variables->circumstance}}</strong> true?</a>

现在,您可以在控制器中访问这些参数:

public function index($debate, $argument){
   dd($debate, $argument);
}

如果此处不需要这两个参数,您可以在路由中使用optional parameters,通过使用?标记,像这样:

Route::get('attack/{debate?}/{argument?}', 'AttackController@index')->middleware('auth');

您现在可以只将一个参数传递给您的路由,而不会导致您的应用程序崩溃。

【讨论】:

  • 我尝试了你所说的一切,从资源中更改了控制器。但仍然得到完全相同的错误。
  • 您是否删除了旧的资源路由?您是否在a 标签中将这些参数作为key =&gt; val 传递?
  • 是的,我删除了资源路由,并完全按照您上面的方式编写了它。 URL 现在看起来像这样:127.0.0.1:8000/attack?debate=1&argument=1 和错误是一样的。
  • 嗯,我觉得很奇怪,这应该可以。尝试使用php artisan route:clear 清除您的路由缓存。另外,您介意将php artisan route:list 的输出粘贴给我吗?另外,我在答案中编辑了a 标签以包含路线名称。
  • 我尝试了 php artisan route:list 并且不知道为什么会发生这种情况。控制器确实存在,并且在 web.php 文件中有一个 Use 语句。 Illuminate\Contracts\Container\BindingResolutionException 目标类 [AttackController] 不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2023-01-03
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多