【问题标题】:Laravel Resource Controller update method not firingLaravel 资源控制器更新方法未触发
【发布时间】:2019-01-09 17:51:44
【问题描述】:

我有一个通过php artisan make:controller TruckController --resource 生成的资源控制器TruckController。

当我转到localhost/trucks/1/edit时,编辑表单显示成功。

当我点击提交时,我被重定向到资源展示页面(localhost/trucks/1);但是,卡车信息没有更新,也没有抛出任何错误。

似乎update 函数根本没有触发,我认为这意味着我的表单中的action 属性有问题,但我仍然不确定。路由应该没有问题,因为路由应该已经定义,因为它是资源控制器。

edit.blade.php

                <form method="PUT" action="{{ action('TruckController@update', ['id' => $truck->id])  }}" class="validate form-horizontal form-groups-bordered" novalidate="novalidate">
                    @csrf
                    <input type="hidden" name="state" data-geo="administrative_area_level_1" value="{{ $truck->state }}">
                    <input type="hidden" name="city" data-geo="locality" value="{{ $truck->city }}">
                    <input type="hidden" name="zipcode" data-geo="postal_code" value="{{ $truck->zipcode }}">



                    [ ... ]
                </form>

TruckController@update

/**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(TruckCreateRequest $request, Truck $truck)
    {
        $validated = $request->validated();

        $truck->name = $request->name;
        $truck->description = $request->description;
        $truck->save();
    }

TruckCreateRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TruckCreateRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name'              => 'required',
            'description'       => 'required',
            'city'              => 'required',
            'state'             => 'required',
            'zipcode'           => 'required',
            'address'           => 'required'
        ];
    }
}

以防万一这可能会有所帮助......

Web.php

<?php

Auth::routes();

// ajax
Route::post('ajax/notifications/clear', 'DashboardController@mark_notifications_read');

Route::get('/', 'DashboardController@index')->name('dash');

Route::resource('events', 'EventController');
Route::resource('venues', 'VenueController');
Route::resource('trucks', 'TruckController');
Route::resource('admin', 'AdminController');

App/Models/Truck.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Truck extends Model
{
    //
}

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    来自 Laravel 文档:

    由于 HTML 表单无法发出 PUT、PATCH 或 DELETE 请求,因此您将 需要添加一个隐藏的 _method 字段来欺骗这些 HTTP 动词。

    尝试在表单中添加一个隐藏的方法字段:

     @method('PUT')
    

    在此处阅读更多信息:https://laravel.com/docs/5.7/blade#method-field

    【讨论】:

    • 将表单操作方法更改为 POST,然后使用它。谢谢!
    【解决方案2】:

    你应该试试这个:

    <form method="POST" action="{{ action('TruckController@update', [$truck->id])  }}" class="validate form-horizontal form-groups-bordered" novalidate="novalidate">
                        @csrf
                        <input type="hidden" name="state" data-geo="administrative_area_level_1" value="{{ $truck->state }}">
                        <input type="hidden" name="city" data-geo="locality" value="{{ $truck->city }}">
                        <input type="hidden" name="zipcode" data-geo="postal_code" value="{{ $truck->zipcode }}">
    
    
    
                        [ ... ]
                    </form>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-19
      • 2013-05-15
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多