簡體   English   中英

路由模型為租戶前綴Route :: resource()綁定多個參數

[英]Route Model Binding multiple parameters for tenant prefix Route::resource()

我正在使用Laravel的資源控制器功能以及Orchestral多租戶數據庫模式管理器作為單個數據庫來開發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']
        ]);
    });
});

這些是我的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);
}

網址:/ api / v1 / 1 / fornecedores / 18

結果:

"1"

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

有人可以告訴我更好的方法嗎?

謝謝!

首先猜測是您試圖隱式綁定您的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;
}

暫無
暫無

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

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