由于冲突,我无法访问占位符前缀的路由

时间:2019-07-17 13:54:34

标签: php laravel laravel-5 url-routing

enter image description here

这是我正在处理的路线(由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
                    );
                }
            });
        }
    };
}

2 个答案:

答案 0 :(得分:1)

对于路由器而言,很难通过任一侧的变量来确定。在像/这样的第一个something/{tenant}/customers之前添加固定路径可能会有所帮助。但是,该错误的原因很可能是根据您的路由列表到达路由器的第一个GET路径是:

{tenant}/customers/{customer}

因为这是第一,Laravel 预计会有一个客户变量。如果将此行放在更高的位置,则不会每次都期望变量。所以:

{tenant}/customers/{customer}
{tenant}/customers/

这应该有帮助...但是可能不是由于两侧的通配符-您必须进行测试。

如果您将这些设置为resource,建议您将它们分解为单独的路由方法进行测试

答案 1 :(得分:1)

最后,经过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'] ]
        ];

问题出在返回时生成的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'] ]
                )
            )
        ];
    }

仍然感谢您的帮助!