[已解决]Dcat admin 在有多个路由的参数下,如何获得指定参数

1. 环境

Laravel 9.22 / PHP 8.1
Dcat Admin: v2.2.2-beta

2. 问题描述?

在路由有多个参数的情况下, 如何在控制器的 detail 和 edit 部分,使用指定参数。

路由定义

Dcat admin 在有多个路由的参数下,如何获得指定参数

路由打印

Dcat admin 在有多个路由的参数下,如何获得指定参数

3. 您期望得到的结果?

这部分的 ID 应为路由中的 balance 参数
Dcat admin 在有多个路由的参数下,如何获得指定参数

4. 您实际得到的结果?

实际获得的是 client 参数。
Dcat admin 在有多个路由的参数下,如何获得指定参数

5. 解决方法

回复链接
首先需要 use HasNestedResource

use Dcat\Admin\Http\Controllers\HasNestedResource;

class BalanceController extends AdminController
{
    use HasNestedResource;

之后添加一个构造函数

public function __construct()
{
  $id = request()->route('你的路由参数');

  $this->setNestedResourceId($id);
}

如果不添加构造函数,可能会在 Update 时,ID 不匹配的问题。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

嵌套资源控制器可以试下这个 trait 能否解决你的问题

GitHub PR: 支持嵌套资源控制器 Nested Resources

当使用嵌套资源控制器时,默认行为总是获取父级模型的 ID。

嵌套资源 Nested Resources

⚠️ 暂不支持 浅层嵌套 Shallow Nesting

// 嵌套资源 Nested Resources
Route::resource('photos.comments', PhotoCommentController::class);
// 这将生成如下路由
/photos/{photo}/comments/{comment}

访问 /photos/1/comments/2 是会错误的展示 id1comment

现在只需添加 HasNestedResource trait 到你的控制器,即可自动纠正此问题。

<?php

namespace App\Admin\Controllers;

...

use Dcat\Admin\Http\Controllers\HasNestedResource;

class PhotoCommentController extends AdminController
{
    use HasNestedResource;

    ...
}

你还可以在构造函数中手动设置模型 ID

    public function __construct()
    {
        // 自己定义 id 获取方式
        $id = 100;

        $this->setNestedResourceId($id);
    }

或者手动设置路由参数的名称

    public function __construct()
    {
        // 自己定义路由参数的名称
        $name = 'test';

        $this->setRouteParameterName($name);
    }
1年前 评论
iVampireSP (楼主) 1年前
讨论数量: 7

嵌套资源控制器可以试下这个 trait 能否解决你的问题

GitHub PR: 支持嵌套资源控制器 Nested Resources

当使用嵌套资源控制器时,默认行为总是获取父级模型的 ID。

嵌套资源 Nested Resources

⚠️ 暂不支持 浅层嵌套 Shallow Nesting

// 嵌套资源 Nested Resources
Route::resource('photos.comments', PhotoCommentController::class);
// 这将生成如下路由
/photos/{photo}/comments/{comment}

访问 /photos/1/comments/2 是会错误的展示 id1comment

现在只需添加 HasNestedResource trait 到你的控制器,即可自动纠正此问题。

<?php

namespace App\Admin\Controllers;

...

use Dcat\Admin\Http\Controllers\HasNestedResource;

class PhotoCommentController extends AdminController
{
    use HasNestedResource;

    ...
}

你还可以在构造函数中手动设置模型 ID

    public function __construct()
    {
        // 自己定义 id 获取方式
        $id = 100;

        $this->setNestedResourceId($id);
    }

或者手动设置路由参数的名称

    public function __construct()
    {
        // 自己定义路由参数的名称
        $name = 'test';

        $this->setRouteParameterName($name);
    }
1年前 评论
iVampireSP (楼主) 1年前

控制器参数顺序和路由参数顺序是一一对应的
可以这么写

public function detail($client,$id){
    dd($id)
}

public function detail(\Illuminate\Http\Request $request){
    dd($request->id)
}
1年前 评论
iVampireSP (楼主) 1年前
public function detail($client, $balance){
    dd($balance)
}

注入的变量和路由变量一致。

或者用 $balance = request()->route("balance") 直接获取

1年前 评论

@iVampireSP 你打印出来的路由并没有对应detail方法的,不知道你的路由是怎么写的

所以只能根据你期望得到的结果和实际得到的结果给你一个方案,即访问admin/users/client/1/balances/4,在对应的控制器方法里正确拿到$client,$id参数

我在自己的dcat里试过了我的解决方案是正常的,你可以复制下面代码到你路由文件里然后执行一下

$router->get('/users/client/{client}/balances/{balance}', function ($client,$balance){
        dd(compact('client','balance'));//
    });//访问admin/users/client/1/balances/4
$router->get('/users/client_b/{client}/balances/{balance}', function (\Illuminate\Http\Request $request){
        dd($request->route()->parameters());
    });//访问admin/users/client_b/1/balances/4
1年前 评论
iVampireSP (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!