簡體   English   中英

路由模型綁定不起作用

[英]Route Model Binding not working

我正在嘗試將路由模型綁定用於簡單的 CRUD,但更新和刪除功能不起作用。 我正在使用 laravel 5.5

Route::resource('admin/file','AdminController');

我的編輯和刪除按鈕視圖

<a href="{{ route('file.edit', ['id'=>$file->id]) }}">

<form action="{{ route('file.destroy', ['id'=>$file->id]) }}" method="post">
   {{method_field('DELETE')}}
   {{csrf_field()}}
   <button type="submit" class="delete">delete</button>
</form>

我的資源控制器:

namespace App\Http\Controllers;

use App\Files;
use Illuminate\Http\Request;

商店工作正常

  public function store(Request $request)
{
    $this->validate($request,[
        'title'=>'required',
        'body'=>'required',
        'price'=>'required',
        'linkFile'=>'required',
    ]);

     Files::create($request->all());
    return redirect(route('file.index'));
}

但編輯和刪除不起作用

public function edit(Files $files)
{
   return view('admin.edit',compact('files'))->with('title','Edit File');
}

public function destroy(Files $files)
{
    $files->delete();
    return redirect(route('file.index'));
}

我的型號:

protected $table='files';

protected $fillable=[
    'title','body','price','linkFile'
];

當我刪除按鈕時什么也沒有發生並編輯為相同

如果我在第一列添加dd($files)以進行編輯和刪除功能,則響應將為[]並且句柄沒有錯誤

這是我的路線清單

在此處輸入圖片說明

任何人都可以幫忙嗎?

最后,2 天后我找到了我的答案,我想在這里為每個可能有同樣問題的人提供我的答案。

要使路由綁定工作,您應該讓類型提示的變量名稱與路由段名稱匹配,如文檔要求:

例如我的編輯方法

這里是我的路由 URI 進行編輯

admin/file/{file}/edit

正如你所看到的,有{file}參數或任何你現在調用的東西只需要在函數參數中准確寫入$file

public function edit(Files $file)
{
   return view('admin.edit',compact('file'));
}

我知道這個問題已經有了解決方案,但讓我補充一些可能對其他人有用的知識......

正如文檔所說,當使用資源控制器時,資源路由將使用基於資源“單一化”名稱的參數。 在這個問題的情況下,由於@siros 在路由中使用了“文件”資源名稱(單數形式),控制器方法中的綁定名稱應該是“文件”,盡管他的模型被命名為Files 如果他試圖使用:

Route::resource('admin/files','AdminController');

控制器仍然需要Files $file才能工作,因為filefiles的單數形式。

但是,該問題還有其他(更優雅的)解決方案。 您可以通過在路由配置中提供parameters選項來更改 URL 中的類型提示變量,如文檔中所示,它將自動應用於showeditupdatedestroy方法。 例如,這將使您在控制器中保留與模型名稱匹配的變量名稱。

所以,在這種情況下,@siros 可以在路由文件中使用它:

Route::resource('admin/file','AdminController', [
    'parameters' => [
        'file' => 'files'
    ]
]);

他可以在控制器中使用它:

public function edit(Files $files)

希望這可以幫助某人。

我再次偶然發現了這個。 我不確定這是我自己的錯誤還是默認缺少這個中間件。

我使用 Laravel 8 並開發了一個 API。 當我嘗試調用應該隱式綁定到模型的路由時,我總是得到一個空數組作為響應。

TL;DR檢查Kernel.php文件$routedMiddlewareGroups api 數組是否添加了SubstituteBindings::class 否則您的請求將無法正確解決。

對 API 的請求 | 通過 ID 獲取用戶 | 前端,Vue.js

UserComponent.vue

methods: {
        close() {
            $('#user-modify-modal').modal('hide');
        },
        open() {
            $('#user-modify-modal').modal({backdrop: 'static', keyboard: false});

            this.fetchUserData(this.params.id);
        },
        async fetchUserData(id) {
            await axios
            .get('users/${this.params.id}')
            .then((result) => {
                this.user = result.data;
            }).catch((err) => {
                console.error(err);
            });
        }
    },

以下是我設置 API 保護路由的方法:

路線/ api.php

//protected routes | API
Route::group(['middleware' => ['api', 'cors', 'json.response', 'auth:api'], 'prefix' => 'v1'], function() {
    Route::post('/logout', [ApiLoginController::class, 'logout']);

    Route::get('/user', function (Request $request) {
        return $request->user();
    });
    Route::get('/users', [UserController::class, 'index']);
    //the function im Testing...
    Route::get('users/{user}', [UserController::class, 'show']);
    Route::post('/users', [UserController::class, 'store']);
    Route::put('/users/{user}', [UserController::class, 'update']);
    Route::delete('/users/{user}', [UserController::class, 'show']);
});

UserController.php

...
/**
     * Get user by ID
     *
     * @param Request $request
     * @param User $user
     * @return void
     */
    public function show(User $user) {

        return response()->json($user);
    }
...

如果沒有這個中間件SubstituteBinding::class ,隱式綁定將無法工作!

確保檢查您的內核 / api 設置

Kernel.php

 /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            //\Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:120,1',
            EncryptCookies::class,
            AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,

            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

現在打電話時

http://localhost/api/v1/users/1

它返回正確的用戶數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM