Php 为租户前缀Route::resource()绑定多个参数的路由模型

Php 为租户前缀Route::resource()绑定多个参数的路由模型,php,laravel,api,multi-tenant,Php,Laravel,Api,Multi Tenant,我正在使用Laravel的特性开发一个API,并将其用作单个数据库 在我的控制方法中,我使用将模型ID注入路由或控制器操作,通常通过查询检索与该ID对应的模型 我的API中的一些相关的路由: | POST | api/v1/{tenant}/fornecedores | store | App\Http\Controllers\Api\Fornecedor\FornecedorController@store | api,tenant,jwt

我正在使用Laravel的特性开发一个API,并将其用作单个数据库

在我的控制方法中,我使用将模型ID注入路由或控制器操作,通常通过查询检索与该ID对应的模型

我的API中的一些相关的路由

| POST      | api/v1/{tenant}/fornecedores                     | store  | App\Http\Controllers\Api\Fornecedor\FornecedorController@store  | api,tenant,jwt.auth |
| GET|HEAD  | api/v1/{tenant}/fornecedores                     | index  | App\Http\Controllers\Api\Fornecedor\FornecedorController@index  | api,tenant,jwt.auth |
| GET|HEAD  | api/v1/{tenant}/fornecedores/count               |        | App\Http\Controllers\Api\Fornecedor\FornecedorController@count  | api,tenant,jwt.auth |
| PUT|PATCH | api/v1/{tenant}/fornecedores/{fornecedor}        | update | App\Http\Controllers\Api\Fornecedor\FornecedorController@update | api,tenant,jwt.auth |
| GET|HEAD  | api/v1/{tenant}/fornecedores/{fornecedor}        | show   | App\Http\Controllers\Api\Fornecedor\FornecedorController@show   | api,tenant,jwt.auth |
| GET|HEAD  | api/v1/{tenant}/fornecedores/{fornecedor}/audits |        | App\Http\Controllers\Api\Fornecedor\FornecedorController@audits | api,tenant,jwt.auth |
...
我的API路由文件的一个示例:

// API V1
Route::group(['prefix' => 'v1/{tenant}', 'middleware' => 'tenant'], function () {

    // Fornecedores
    Route::group(['prefix' => 'fornecedores'], function () {
        Route::get('count', 'Api\Fornecedor\FornecedorController@count');
        Route::get('{fornecedor}/audits', 'Api\Fornecedor\FornecedorController@audits');

        Route::resource('/', 'Api\Fornecedor\FornecedorController', [
            'parameters' => ['' => 'fornecedor'],
            'except' => ['create', 'edit', 'destroy']
        ]);
    });
});
public function index()
{
    return $this->fornecedorService->getFornecedoresPaginate();
}

// This is line 48 (throw below):
public function show(Fornecedor $fornecedor)
{
    return $fornecedor;
}
以下是我的FornecedorController.php的一些方法:

// API V1
Route::group(['prefix' => 'v1/{tenant}', 'middleware' => 'tenant'], function () {

    // Fornecedores
    Route::group(['prefix' => 'fornecedores'], function () {
        Route::get('count', 'Api\Fornecedor\FornecedorController@count');
        Route::get('{fornecedor}/audits', 'Api\Fornecedor\FornecedorController@audits');

        Route::resource('/', 'Api\Fornecedor\FornecedorController', [
            'parameters' => ['' => 'fornecedor'],
            'except' => ['create', 'edit', 'destroy']
        ]);
    });
});
public function index()
{
    return $this->fornecedorService->getFornecedoresPaginate();
}

// This is line 48 (throw below):
public function show(Fornecedor $fornecedor)
{
    return $fornecedor;
}
但是,当尝试访问使用路由模型绑定的URL时,我遇到以下错误:

URL:/api/v1/1/fornecedores/1

FatalThrowableError in FornecedorController.php line 48:
Type error: Argument 1 passed to App\Http\Controllers\Api\Fornecedor\FornecedorController::show() must be an instance of App\Models\Fornecedor, string given
这是全部跟踪:

in FornecedorController.php line 48
at FornecedorController->show('1', object(Fornecedor))
at call_user_func_array(array(object(FornecedorController), 'show'), array('tenant' => '1', 'fornecedor' => object(Fornecedor))) in  Controller.php line 55
at Controller->callAction('show', array('tenant' => '1', 'fornecedor' => object(Fornecedor))) in ControllerDispatcher.php line 44
at ControllerDispatcher->dispatch(object(Route), object(FornecedorController), 'show') in Route.php line 203
at Route->runController() in Route.php line 160
at Route->run() in Router.php line 559
at Router->Illuminate\Routing\{closure}(object(Request)) in Pipeline.php line 30
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in GetUserFromToken.php line 46
at GetUserFromToken->handle(object(Request), object(Closure)) in
...
我可以验证在检索参数时是否存在明显的混乱。检查路线参数时,结果如下:

public function show($fornecedor)
{
    dd(\Route::current()->parameters());
}
URL:/api/v1/1/fornecedores/18

结果:

array:2 [
  "tenant" => "1"
  "fornecedor" => "18"
]
"1"
在尝试检索提供商的路由时:

public function show($fornecedor)
{
    dd($fornecedor);
}
URL:/api/v1/1/fornecedores/18

结果:

array:2 [
  "tenant" => "1"
  "fornecedor" => "18"
]
"1"
即使使用bind,我得到的参数也是不正确的。其他不使用第二个参数的路由正常

有人能告诉我一个更好的方法吗


谢谢

第一个猜测是您试图隐式绑定
fornecedor
参数,而Laravel无法解析或识别它

您可以在routes文件的下面某处声明参数模型关系(
routes/web.php
routes.php

您的
show
方法也不适合
tenent
参数。方法应如下所示:

public function show($tenant, Fornecedor $fornecedor){
    return $fornecedor;
}