【问题标题】:laravel Error Exception Missing argument 2 for Controller::destroy()laravel 错误异常缺少 Controller::destroy() 的参数 2
【发布时间】:2014-12-01 21:52:06
【问题描述】:

我是 Laravel 的新手,我试图在控制器中调用 destroy 函数并传入两个参数,但出现错误:GradoController::destroy() 的异常缺少参数 2。

我的成绩从 1(第一)到 6(第六),每个都有与之相关的科目。成绩在页面上的选项卡中列出,通过单击选项卡,您可以获得与成绩相关的科目列表。我在每个主题旁边放置了一个删除按钮,以便用户可以单击删除并将该主题从成绩中分离出来。

我正在尝试将gradeId 和subjectId 都传递给GradoController 中的destroy 方法

我的视图文件 index.blade.php:

<html>
 <head>

 {{HTML::script('assets/js/jquery-1.11.1.js'); }}
 {{HTML::script('assets/js/jquery-ui.js');  }}
 {{HTML::script('assets/js/jquery-ui.min.js'); }}
 {{HTML::style('assets/css/jquery-ui.min.css'); }}

  <script>
  $(function() {
    $( '#tabs' ).tabs();
  });
  </script>
</head>


<body>
<h1>Lista Materias por Grado</h1>
<?php 
    $year = date("Y");
    $month = date("m"); 
    if($month < 8){
       $year = $year - 1;  
    } ?>
<h2>{{$year}}-{{$year+1}}</h2>

<div id="tabs">
<ul> <?php $i=1; ?>
   @foreach($grados as $grado)
    <li><a href="#tabs-{{$i}}">Grado:{{ $grado->name_grados}} </a></li>
    <?php $i++; ?>
   @endforeach
  </ul>
  <?php $i = 1; ?>
  @foreach($grados as $grado)
    <div id="tabs-{{$i}}" >
           @if($grado->subject->count())
             @foreach($grado->subject as $subject)
          <li> {{ $subject->name_subjects }} 


        {{Form::open(array('method' => 'DELETE', 'route' => array('grados.destroy', $grado->id_grados, $subject->id_subjects)))  }} 


            {{ Form::submit('Delete',array('class' => 'btn btn-danger')) }}
     </li> 
         @endforeach
           @else
            No hay materias asociadas
       @endif
             </br></br>
              {{ link_to_route('grados.edit', 'Agregar Materias',
 array($grado->id_grados), array('class' => 'btn btn-info')) }} 
             <?php $i++; ?>
  </div>
@endforeach
</div>

我的 GradoController 的销毁函数:

public function destroy($gradoId, $subjectId)
{        

        $grado = Grado::find($gradoId);
        $year = 2014;        
        $grado->subject()->detach($subjectId, array('year_grado_subject'=>$year));


        return Redirect::route('grados.index');                 
}

在我拥有的路线中:

Route::get('grados/{id_grados}/{id_subjects}/destroy', 'GradoController@destroy');
Route::resource('grados', 'GradoController');

谢谢!

【问题讨论】:

  • $subject->id_subjects 您的数据库中有一个名为 id_subjects 的字段吗?或者是 id_subject
  • 是的,它叫做 id_subjects。

标签: php laravel routes


【解决方案1】:

我能想象的是表单使用了这​​个动作

Route::resource('grados', 'GradoController');

并且“默认删除”(参见http://laravel.com/docs/4.2/controllers#restful-resource-controllers)仅使用一个参数(/grados/{parameter}),因此第二个参数会丢失并且不会传递给 Controller 操作。这是因为没有设置路由

Route::get('grados/{id_grados}/{id_subjects}/destroy','GradoController@destroy');

而且它不使用 Route::delete,而是使用 Route::get。 所以把它改成

Route::delete('grados/{id_grados}/{id_subjects}/destroy',['as' =&gt; 'grados.destroy', 'uses' =&gt; 'GradoController@destroy']);

希望能解决问题。另外,我会避免两次定义相同的路线。例如。你可以用这个:

Route::resource('grados', 'GradoController', array('except' =&gt; array('destroy')));

【讨论】:

  • 非常感谢您的回复。现在看起来它正在查找带有参数的函数,因为它重定向到:localhost/laravel/grados{gradoId}/{subjectID}/destroy,但现在它给了我一个 MethodNotAllowedHttpException。我该如何解决这个问题。
  • 好的,我将 Route::get 更改为 Route::delete 并且它不再给出异常,但现在主题按 Id 顺序删除(最低 id 在前)不管我按下哪个删除按钮,但我想这是另一个帖子的问题。感谢您的建议,我被卡了很长时间,他们推动了我前进!
  • 啊,对了,应该是Route::delete,会更新答案
猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 2017-04-06
  • 2022-01-01
  • 2012-12-31
  • 2013-05-31
  • 2014-01-10
  • 2016-05-17
相关资源
最近更新 更多