CakePHP 3.x如何在映射的资源中包含params?

时间:2015-10-18 09:08:55

标签: rest cakephp cakephp-3.0

这就是我在我的路线中所拥有的:

Router::scope('/', function ($routes) {
    $routes->extensions(['json']);
    $routes->resources('CustomerCompanies', [
        'map' => [
            'get_by_account' => [
                'action' => 'get_by_account',
                'method' => 'GET',
            ]
        ]
    ]);  

这是get_by_account内的方法CustomerCompaniesController.php

/**
 * Pagination method by Customer Account id
 *
 * @param string|null $id Customer Account id.
 * @return void Redirects to index.
 * @throws \Cake\Network\Exception\NotFoundException When record not found.
 */
public function get_by_account($customer_account_id = null)
{

}

关系:

  1. CustomerAccounts hasMany CustomerCompanies
  2. CustomerCompanies belongsTo CustomerAccounts
  3. 我想通过提供CustomerAccount ID返回属于特定CustomerAccount的CustomerCompanies列表,然后返回json结果。

    我是否需要更改get_by_account中的某些内容以指示该参数?如果是的话,怎么样?

    更新

    这是我在文件中看到的:

    what i saw in documents

2 个答案:

答案 0 :(得分:3)

您必须定义:id路由元素,即passed by default(目前无法传递更多自定义路由元素)。您可以在地图条目的数组键中执行此操作

'map' => [
    'get_by_account/:id' => [
        'action' => 'get_by_account',
        'method' => 'GET',
    ]
]

或通过path选项(默认情况下,密钥设置为path选项的值)

'map' => [
    'get_by_account' => [
        'action' => 'get_by_account',
        'method' => 'GET',
        'path' => 'get_by_account/:id'
    ]
]

另见

答案 1 :(得分:1)

我意识到业务逻辑明智,我试图创建一个嵌套资源。

因此,我将把我的答案包含在我自己question的另一个关于创建嵌套资源的答案中。

------- ANSWER -----------

routes.php

中执行此操作
$routes->resources('Parents', function ($routes) {
    $routes->resources('Children');
});

$routes->resources('Children');

ChildrenController.php

protected function _prepareConditions() {
    $parentId = isset($this->request->params['parent_id']) ? $this->request->params['parent_id'] : null;

    if ($parentId == null) {
        return [];
    }

    return [
        'Children.parent_id' => $parentId
    ];
}

public function index()
{
    $conditions = $this->_prepareConditions();

    $this->paginate = [
        'contain' => ['Parents'],
        'conditions' => $conditions
    ];
  // ... and so on

您将能够执行以下操作:

  1. /父母/ 1 /儿童
  2. /parents/1/children.json
  3. /儿童
  4. /children.json
  5. 为什么会这样?

    http://book.cakephp.org/3.0/en/development/routing.html#creating-nested-resource-routes

    告诉我们,基本上基本上从请求参数中检索父ID。

    它没有明确说明的是,路由将重用基本的5个函数:索引,添加,查看,删除,编辑,即使将它们嵌套在父URL下也是如此。

    为什么您还为儿童提供单独的资源路线?

    这允许/ children和/children.json在你需要的时候也可以工作。

    添加怎么办?

    我没有尝试过,但我没有预见到使用它作为

    的任何问题
    1. /父母/ 1 /儿童/添加
    2. /parents/1/children/add.json
    3. /儿童/添加
    4. /children/add.json