laravel 路径模型绑定不起作用

2lpgd968  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(156)

我尝试使用简单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'
];

当我删除按钮时,没有任何React,并按相同方式编辑
如果我在编辑和删除功能的第一列添加dd($files),则响应将为[],并且句柄没有错误
这里是我的路线列表

任何人都可以帮助拜托?

j2qf4p5b

j2qf4p5b1#

最后,经过2天我找到了我的答案,我想在这里提供我的答案,每个人谁可能有同样的问题。

要使路由绑定工作,类型提示的变量名必须与路由占位符名匹配

例如我的编辑方法
下面是我要编辑的路由URI

admin/file/{file}/edit

正如您所看到的,路由定义中有一个{file}占位符,因此相应的变量必须称为$file

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

lf5gs5x22#

我又偶然发现了这个。我不确定这是我自己的错误还是这个中间件默认丢失了。
我正在使用Laravel 8并开发一个API。当我试图调用一个应该隐式绑定到模型的路由时,我总是得到一个空数组作为响应。

TL;DR检查Kernel.php文件$routedMiddlewareGroups API数组中是否添加了SubstituteBindings::class。否则,将无法正确解析您的请求。

对API的请求|按ID获取用户|前端,版本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

它返回正确的用户数据。

velaa5lx

velaa5lx3#

我知道这个问题已经有了解决方案,但让我补充一些可能对其他人有用的知识...
正如文档所述,当使用资源控制器时,资源路由将使用基于资源“单数化”名称的参数,在问题的情况下,由于@siros在路由中使用的是“file”资源名称(单数形式),因此控制器方法中的绑定名称应该是“file”,尽管他的模型名为Files,如果他试图用途:

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

控制器仍然需要Files $file才能工作,因为filefiles的单数形式。

然而还有其他您可以通过在路由配置中提供parameters选项来更改URL中的类型提示变量,如文档中所示,该选项将自动应用于showedit``updatedestroy方法。例如,这将允许您保持控制器中的变量名称与型号名称匹配。

因此,在本例中,@siros可以在routes文件中使用此函数:

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

他可以在控制器中使用这个:

public function edit(Files $files)

希望这能帮到什么人。

相关问题