我正在開發一個API,使用Laravel的Resource Controllers功能並使用Orchestral Multi-tenant Database Schema Manager作爲單一數據庫。路由模型爲租戶前綴綁定多個參數Route :: resource()
在我的控制方法中,我使用Route Model Binding爲模型ID注入路由或控制器動作,通常是查詢以檢索與該ID對應的模型。
一些相關路線從我的API:
| POST | api/v1/{tenant}/fornecedores | store | App\Http\Controllers\Api\Fornecedor\[email protected] | api,tenant,jwt.auth |
| GET|HEAD | api/v1/{tenant}/fornecedores | index | App\Http\Controllers\Api\Fornecedor\[email protected] | api,tenant,jwt.auth |
| GET|HEAD | api/v1/{tenant}/fornecedores/count | | App\Http\Controllers\Api\Fornecedor\[email protected] | api,tenant,jwt.auth |
| PUT|PATCH | api/v1/{tenant}/fornecedores/{fornecedor} | update | App\Http\Controllers\Api\Fornecedor\[email protected] | api,tenant,jwt.auth |
| GET|HEAD | api/v1/{tenant}/fornecedores/{fornecedor} | show | App\Http\Controllers\Api\Fornecedor\[email protected] | api,tenant,jwt.auth |
| GET|HEAD | api/v1/{tenant}/fornecedores/{fornecedor}/audits | | App\Http\Controllers\Api\Fornecedor\[email protected] | 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\[email protected]');
Route::get('{fornecedor}/audits', 'Api\Fornecedor\[email protected]');
Route::resource('/', 'Api\Fornecedor\FornecedorController', [
'parameters' => ['' => 'fornecedor'],
'except' => ['create', 'edit', 'destroy']
]);
});
});
這些都是我FornecedorController.php的一些方法:
public function index()
{
return $this->fornecedorService->getFornecedoresPaginate();
}
// This is line 48 (throw below):
public function show(Fornecedor $fornecedor)
{
return $fornecedor;
}
但是試圖訪問使用該路由模型綁定我得到以下錯誤的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());
}
網址:/ API/V1/1/fornecedores/18
結果:
array:2 [
"tenant" => "1"
"fornecedor" => "18"
]
,並試圖獲取供應商的路由時:
public function show($fornecedor)
{
dd($fornecedor);
}
URL:/ API/V1/1/fornecedores/18
結果:
"1"
即使使用綁定我得到的參數是不正確的。其他不使用第二個參數的路由也可以。
有人能告訴我一個更好的方法嗎?
謝謝!