2017-04-16 26 views
0

我正在開發一個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" 

即使使用綁定我得到的參數是不正確的。其他不使用第二個參數的路由也可以。

有人能告訴我一個更好的方法嗎?

謝謝!

回答

0

首先猜測是您試圖隱式綁定您的參數fornecedor,並且Laravel無法解析或識別它。

可以聲明在你的路線文件(routes/web.phproutes.php

Route::model('fornecedor', \App\Models\ Fornecedor::class); 

而且你show方法不迎合tenent參數的下方某處您的參數模型關係。該方法應該是這樣的:

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

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