Laravel 5.0 路由模型绑定在销毁操作中不起作用

Posted

技术标签:

【中文标题】Laravel 5.0 路由模型绑定在销毁操作中不起作用【英文标题】:Laravel 5.0 Route Model Binding didn't work in destroy action 【发布时间】:2016-05-11 17:33:37 【问题描述】:

我有一个带有一个提交按钮的表单,并将操作设置为销毁控制器中的方法。相同的代码适用于其他表单和控制器,但不适用于这个。当我在 Chrome 中检查我的网页时,表单标签中的操作是错误的。

这是我的表格:

!! Form::model($company, ['method' => 'PATCH', 'action' => ['Setting\Organization\CompaniesController@update', 'files'=>true, $company->CompanyCode]]) !!
    <div class="form-group">
        !! Form::label('CompanyCode', 'Company Code : ', ['class' => 'col-lg-3 col-md-3 col-sm-3 col-xs-3']) !!
        <div class="col-lg-9 col-md-9 col-sm-9 col-xs-9">
            !! Form::text('CompanyCode', null, ['class' => 'form-control', 'readonly' => true]) !!
        </div>
    </div>

    <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2">
        !! Form::submit('Update Company', ['class' => 'btn btn-primary', 'id' => 'btnSubmit']) !!
    </div>

!! Form::close() !!

!! Form::model($company, ['method' => 'DELETE', 'action' => 'Setting\Organization\CompaniesController@destroy', $company->CompanyCode]) !!

    <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2">
        !! Form::submit('Delete Company', ['class' => 'btn btn-danger']) !!
    </div>

!! Form::close() !!

更新按钮工作正常。

我通过 Setting\Organization\CompaniesController 中的编辑方法访问此表单:

public function edit(Company $company)
    return view('setting.organization.company.edit', compact('company'));

这里是 Setting\Organization\CompaniesController 中的 destroy 方法:

public function destroy(Company $company)
    dd($company);
    //------------ delete company
    $company->IsActive = 0;
    $company->update();

    flash()->info('Company ' . $company->Name . ' has been deleted.');
    return redirect('company');

dd($company); 行甚至不起作用,因为表单没有链接到正确的路径。

RouteServiceProvider 文件:

public function boot(Router $router)

    parent::boot($router);

    $router->bind('client', function($id)
        return \App\Models\Setting\ClientAccount::getClientFromAccountName($id);
    );

    $router->bind('company', function($id)
        return Company::getCompanyFromCode($id);
    );


.

.

这是表单的检查元素:

<form method="POST" action="http://localhost/hrmsystem/public/company/%7Bcompany%7D" accept-charset="UTF-8" com160202145801="COM160202145801">
<input name="_method" type="hidden" value="DELETE">
<input name="_token" type="hidden" value="B2luMsN5Oy81GUFLoUCoHc2ERnqHe1AYir1DEY4N">

    <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2">
        <input class="btn btn-danger" type="submit" value="Delete Company">
    </div>

</form>

.

.

我提交表格后:

我了解错误是 ModelNotFoundException,因为传递的 CompanyCode 是 %7Bcompany%7D。但我不知道它是从哪里来的。

我在 routes.php 中使用Route::resource

请帮忙,我是 laravel 新手。

【问题讨论】:

【参考方案1】:

嘿,这取决于您的路由 如果你使用Route::resource('companies','CompaniesController');,它对你来说很容易,不需要麻烦,你可以像这样使用你的按钮

 !! Form::open(array('class' => 'form-inline', 'method' => 'DELETE', 'route' => array('companies.destroy',  $company->CompanyCode))) !!
                                !! Form::submit('DELETE', array('class' => 'btn btn-danger btn-xs')) !!
                                !! Form::close() !!

如果你想使用你的方式,那么你必须像这样使用你的表单

!! Form::open('method' => 'DELETE', 'action' => ['Setting\Organization\CompaniesController@destroy', $company->CompanyCode]) !!
    <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2">
        !! Form::submit('Delete Company', ['class' => 'btn btn-danger']) !!
    </div>
!! Form::close() !!

【讨论】:

您好,我尝试了您的解决方案,但没有奏效,错误仍然相同。有什么想法吗? 嗨@Hamel,我使用了你的第一个解决方案(使用路线而不是行动),它就像一个魅力!非常感谢,你拯救了我的一天:D :) :) :) 很高兴为您提供帮助【参考方案2】:

您不使用模型绑定进行 DELETE

!! Form::open('method' => 'DELETE', 'action' => ['Setting\Organization\CompaniesController@destroy', $company->CompanyCode]) !!
    <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2">
        !! Form::submit('Delete Company', ['class' => 'btn btn-danger']) !!
    </div>
!! Form::close() !!

【讨论】:

嗨@Elias,我尝试了您的解决方案,但它对我不起作用,错误仍然相同,因为Chrome检查元素中Form标签中的操作与我发布的相同.请帮忙。 我已经使用@Hamel 解决方案修复了我的错误。感谢您抽出宝贵时间回答我的问题:D【参考方案3】:

你是正确的,表单标签中的动作是错误的。

试试这个:

!! Form::model($company, [
    'method' => 'PATCH',
    'action' => ['Setting\Organization\CompaniesController@update', $company->CompanyCode],
    'files'=>true
]) !!

错误是在动作数组中包含'files' =&gt; true,因为它不是动作的一部分。它是它自己的属性,所以它应该与动作数组分开/在它之外。

【讨论】:

嗨@Thomas,感谢您的回答,但不幸的是,这不是问题所在,因为问题出在另一个表单上(在我的帖子中,我在同一页面上写了 2 个表单)。确实,我在第一个表单中使用了文件上传,但我没有在帖子中写它,因为第一个表单工作得很好。你能帮帮我吗? 我已经使用@Hamel 解决方案修复了我的错误。感谢您抽出宝贵时间回答我的问题:D

以上是关于Laravel 5.0 路由模型绑定在销毁操作中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

laravel 路由模型绑定

Laravel 路由模型绑定 - Laravel 5.7

Blade 视图组件的 Laravel 路由模型绑定

Laravel 5.2 使用 uuid 字符串作为 id 的隐式路由模型绑定

Laravel - 使用 json 字段自定义路由模型绑定中的键

Laravel 5.5 路由中的模型绑定不起作用