Я не могу получить доступ к маршруту с префиксом-заполнителем из-за конфликта

Я не могу получить доступ к маршруту с префиксом-заполнителем из-за конфликта

Вот маршруты, над которыми я работаю (сгенерированные методом 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
                    );
                }
            });
        }
    };
}

Можете ли вы опубликовать код, определяющий маршруты?

Thomas 17.07.2019 16:00

Код добавлен, но боюсь он вам не поможет

Shizzen83 17.07.2019 16:05

Хорошо, это намного сложнее, чем я думал :) Я бы попробовал отладить роутер, начиная с Illuminate\Routing\Router::findRoute()

Thomas 17.07.2019 16:20

Что ты хочешь, чтобы я выкинул?

Shizzen83 17.07.2019 16:28

Откуда этот пакет получает список имен маршрутов? Загружается ли он из БД? (Я знаю, что очень важно определять маршруты в правильном порядке, иначе сработает неправильный)

Rob Biermann 17.07.2019 16:30

У меня нет никакого контроля над порядком генерации, потому что эти маршруты исходят из apiResource метода маршрутизатора самого Laravel.

Shizzen83 17.07.2019 16:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
6
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Маршрутизатору довольно сложно определить переменную на любой стороне. Это может помочь добавить сплошной путь перед первым / лайком something/{tenant}/customers. Однако причина ошибки, скорее всего, в том, что первый GET-путь к маршрутизатору в соответствии с вашим списком маршрутов:

{tenant}/customers/{customer}

Потому что это первый, Laravel ожидает поступления переменной клиента. Если вы поместите эту строку выше, она не будет ожидать переменную каждый раз. Так:

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

Это должно помочь ... но это может быть не из-за подстановочных знаков с обеих сторон - вам придется проверить.

Если у вас есть эти наборы как resource, я предлагаю вам разбить их на отдельные методы маршрута для тестирования.

У меня не получилось воспроизвести проблему с битыми маршрутами Route::get('{tenant}/tests', function () {return response()->json(['test0']);}); Route::get('{tenant}/tests/{test1}', function () {return response()->json(['test1']);}); работает и наоборот (оба отвечают test0). Упаковать их в группу маршрутов с префиксом тоже можно...

Shizzen83 17.07.2019 16:44

Я думаю, это означает, что проблема, возможно, связана с двумя вещами, которые я отметил выше. Возможно, из-за подстановочного знака в первом слове вы неосознанно дублируете первое слово другого маршрута. IE {Route1}/customers на самом деле уже является жестко запрограммированным маршрутом Route1/customers где-то еще. Я бы проверил ваш текущий resource словом перед {tenant}, например testing/{tenant}/customers и т. д.

Watercayman 17.07.2019 16:49

Я уже пробовал это, прежде чем открывать этот вопрос, и проблема также возникает здесь, к сожалению. Missing required parameters for [Route: json-api.customers.show] [URI: testing/{tenant}/customers/{customer}].

Shizzen83 17.07.2019 16:53

Стреляй, это печально. Мое единственное предложение — объединить две вещи — добавить первое слово (тестирование) и отделить их от resource. У меня это случалось раньше, и обычно это была одна или другая из этих двух вещей, которые я отметил выше (или обе).

Watercayman 17.07.2019 16:56

Я попробую несколько тестов и дам вам знать, если найду рабочий способ. Спасибо, в любом случае.

Shizzen83 17.07.2019 17:09
Ответ принят как подходящий

Наконец, через 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'] ]
                )
            )
        ];
    }

Спасибо в любом случае за вашу помощь!

Другие вопросы по теме