由于冲突,我无法访问以占位符为前缀的路由
I can't access a placeholder-prefixed route because of a conflict
这是我正在处理的路线(由 apiResource
Laravel 的方法生成)。如您所见,有 1 或 2 个占位符。当我尝试获取 anything/customers
时,我的问题就来了。它引发了这个异常:
Missing required parameters for [Route: json-api.customers.show] [URI: {tenant}/customers/{customer}].
除非我遗漏了一个明显的东西,否则路由器应该接受这个请求,因为 anything/customers
匹配 {tenant}/customers
.
如果您对此有任何帮助,我将不胜感激。提前致谢。
编辑: 我添加这段代码来回答评论,但我认为这不会有助于理解这个问题(我正在实施一个基于 JSON:API规格)。
protected function jsonApiResource()
{
return function (string $class, array $options = []) {
if ($routerMethod = $class::getRouterMethod()) {
$middleware = array_merge(
$options['middleware'] ?? [],
$class::getApiMiddlewares()
);
$as = $options['as'] ?? '';
$prefix = $class::getRouterPrefix();
$this->group(compact('middleware', 'as', 'prefix'), function ($router) use ($class, $routerMethod, $options) {
$alias = $class::getAlias();
$controller = $class::getControllerClass();
$router->{$routerMethod}(
$alias,
$controller,
Arr::only($options, ['only', 'except'])
);
foreach ($class::getRelationsRoutes() as $relationshipName => $relationshipMethods) {
$router->resourceRelationship(
$alias,
$relationshipName,
$controller,
$relationshipMethods
);
}
});
}
};
}
路由器很难用任一侧的变量来确定。在第一个 /
(例如 something/{tenant}/customers
)之前添加一个实体路径可能会有所帮助。但是,错误的原因很可能是根据您的路由列表命中路由器的第一个 GET 路径是:
{tenant}/customers/{customer}
因为这是第一个,Laravel 预计会有一个客户变量进来。如果你把这条线放在更高的地方,它不会每次都期待这个变量。所以:
{tenant}/customers/{customer}
{tenant}/customers/
这应该有帮助...但可能不是因为两边的通配符 - 您必须进行测试。
如果您将这些设置为 resource
,我建议您将它们分解为单独的路由方法进行测试
终于在3天后,我找到了来源,异常消息误导了我。
/**
* Get links to fetch the model or one of its relationships.
*
* @param string|null $relationshipName
* @return array
*/
public function getApiLinks(string $relationshipName = null)
{
$urlGenerator = app()->make('url');
$identifiers = $this->getApiIdentifiers();
if ($relationshipName) {
return [
'self' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'index'),
'related' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'related')
];
}
return [
'self' => $urlGenerator->route(
'json-api.'.$identifiers['type'].'.show',
[ Str::singular($identifiers['type']) => $identifiers['id'] ]
];
问题来自 return 上的 URL 代,任何额外的 URL 占位符都不会包含在数组中,顺便说一句,导致出现此消息。
通过此修复,它现在可以工作了:
/**
* Get links to fetch the model or one of its relationships.
*
* @param string|null $relationshipName
* @return array
*/
public function getApiLinks(string $relationshipName = null)
{
$urlGenerator = app()->make('url');
$identifiers = $this->getApiIdentifiers();
$otherParams = $urlGenerator->getRequest()->route()->parameters();
if ($relationshipName) {
return [
'self' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'index', $otherParams),
'related' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'related', $otherParams)
];
}
return [
'self' => $urlGenerator->route(
'json-api.'.$identifiers['type'].'.show',
array_merge(
$otherParams,
[ Str::singular($identifiers['type']) => $identifiers['id'] ]
)
)
];
}
谢谢你的帮助!
这是我正在处理的路线(由 apiResource
Laravel 的方法生成)。如您所见,有 1 或 2 个占位符。当我尝试获取 anything/customers
时,我的问题就来了。它引发了这个异常:
Missing required parameters for [Route: json-api.customers.show] [URI: {tenant}/customers/{customer}].
除非我遗漏了一个明显的东西,否则路由器应该接受这个请求,因为 anything/customers
匹配 {tenant}/customers
.
如果您对此有任何帮助,我将不胜感激。提前致谢。
编辑: 我添加这段代码来回答评论,但我认为这不会有助于理解这个问题(我正在实施一个基于 JSON:API规格)。
protected function jsonApiResource()
{
return function (string $class, array $options = []) {
if ($routerMethod = $class::getRouterMethod()) {
$middleware = array_merge(
$options['middleware'] ?? [],
$class::getApiMiddlewares()
);
$as = $options['as'] ?? '';
$prefix = $class::getRouterPrefix();
$this->group(compact('middleware', 'as', 'prefix'), function ($router) use ($class, $routerMethod, $options) {
$alias = $class::getAlias();
$controller = $class::getControllerClass();
$router->{$routerMethod}(
$alias,
$controller,
Arr::only($options, ['only', 'except'])
);
foreach ($class::getRelationsRoutes() as $relationshipName => $relationshipMethods) {
$router->resourceRelationship(
$alias,
$relationshipName,
$controller,
$relationshipMethods
);
}
});
}
};
}
路由器很难用任一侧的变量来确定。在第一个 /
(例如 something/{tenant}/customers
)之前添加一个实体路径可能会有所帮助。但是,错误的原因很可能是根据您的路由列表命中路由器的第一个 GET 路径是:
{tenant}/customers/{customer}
因为这是第一个,Laravel 预计会有一个客户变量进来。如果你把这条线放在更高的地方,它不会每次都期待这个变量。所以:
{tenant}/customers/{customer}
{tenant}/customers/
这应该有帮助...但可能不是因为两边的通配符 - 您必须进行测试。
如果您将这些设置为 resource
,我建议您将它们分解为单独的路由方法进行测试
终于在3天后,我找到了来源,异常消息误导了我。
/**
* Get links to fetch the model or one of its relationships.
*
* @param string|null $relationshipName
* @return array
*/
public function getApiLinks(string $relationshipName = null)
{
$urlGenerator = app()->make('url');
$identifiers = $this->getApiIdentifiers();
if ($relationshipName) {
return [
'self' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'index'),
'related' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'related')
];
}
return [
'self' => $urlGenerator->route(
'json-api.'.$identifiers['type'].'.show',
[ Str::singular($identifiers['type']) => $identifiers['id'] ]
];
问题来自 return 上的 URL 代,任何额外的 URL 占位符都不会包含在数组中,顺便说一句,导致出现此消息。
通过此修复,它现在可以工作了:
/**
* Get links to fetch the model or one of its relationships.
*
* @param string|null $relationshipName
* @return array
*/
public function getApiLinks(string $relationshipName = null)
{
$urlGenerator = app()->make('url');
$identifiers = $this->getApiIdentifiers();
$otherParams = $urlGenerator->getRequest()->route()->parameters();
if ($relationshipName) {
return [
'self' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'index', $otherParams),
'related' => $urlGenerator->jsonApiRelationship($identifiers['type'], $identifiers['id'], $relationshipName, 'related', $otherParams)
];
}
return [
'self' => $urlGenerator->route(
'json-api.'.$identifiers['type'].'.show',
array_merge(
$otherParams,
[ Str::singular($identifiers['type']) => $identifiers['id'] ]
)
)
];
}
谢谢你的帮助!