Контроллер не может получить доступ к идентификатору модели, несмотря на правильную настройку. Я использую Laravel 10 для этого REST API

Когда я пытался получить доступ к идентификатору модели (JenisSurvey) в методе show JSController, идентификатор всегда был нулевым, даже если модель получена правильно. Интересно, что в моем приложении есть и другие контроллеры, где подобные операции работают прекрасно. Например, если я использую модель User в другом контроллере, я могу без проблем получить доступ к идентификатору.

Я уже проверил конфигурацию маршрута, привязку модели, автозагрузку файлов, логику контроллера, данные с искомым идентификатором существуют в базе данных. Вроде бы всё в порядке, и логика зеркально повторяет логику других контроллеров, где работают подобные операции.

Вот упрощенная версия метода show в JSController:

public function show(JenisSurvey $jenisSurvey)
{
    dd($jenisSurvey->id); // This always returns null

    if (!$jenisSurvey) {
        return response()->json(['error' => 'Data not found.'], 404);
    }
    return new JSResource($jenisSurvey);
}

Интересно, что в моем приложении есть и другие контроллеры, где подобные операции работают прекрасно. Например, если я использую модель User в другом контроллере (UserController), я могу без проблем получить доступ к идентификатору. Вот упрощенная версия метода show в UserController для сравнения:

public function show(User $user)
{
    dd($user->id); // This returns the correct ID
    return new UserResource($user);
}

Кроме того, когда я переключаю модель и ресурс в UserController на JenisSurvey, все работает как положено.

// UserController but with jenis survey model and resource
public function show(JenisSurvey $user)
{
    dd($user->id); // This returns the correct ID
    return new JSResource($user);
}

Вот маршруты:

Route::group(['namespace' => 'App\Http\Controllers', 'middleware' => 'auth:sanctum'],function () {
    Route::apiResource('users', UserController::class)->middleware(['auth','verified','role:admin']);
    Route::apiResource('js', JSController::class)->middleware(['auth','verified','role:admin|nasabah']);
});

Вот скриншоты ниже.

JSController (контроллер опросов Дженис):

UserController, использующий модель и ресурс пользователя:

UserController, использующий модель и ресурс JenisSurvey:

JSController (var сбрасывает всю модель):

фото

UserController (с моделью и ресурсом Jenis Survey):

фото

Учитывая, что проблема, похоже, специфична для файла JSController (Jenis Survey Controller), я подозреваю, что в его настройке или среде может быть что-то уникальное. Мы будем очень признательны за любые идеи или предложения о том, как устранить эту проблему в дальнейшем.

Как определяется ваш api/js маршрут? Пожалуйста, отредактируйте свой вопрос и включите также определения маршрутов.

zlatan 25.04.2024 16:31

Получаете ли вы что-нибудь при отладке всей модели, а не только идентификатора dd($jenisSurvey);?

Luckyfella 25.04.2024 16:42

Готово, отредактировано @Luckyfella

DFYZ 26.04.2024 02:53

попробуйте установить свою базу данных в форме множественного числа, например, если вы используете модель пользователя для «пользователей» базы данных, если вы используете Jenissurvey, попробуйте «jenissurveys». Я сталкиваюсь с той же ошибкой, что и 2 года назад. Я предлагаю не использовать стиль Camel Case для названия модели, если вы хотите абстрагировать идентификатор в модели.

Sidik 26.04.2024 06:14

пожалуйста, покажи свой route:list --path=api/js

kris gjika 26.04.2024 09:51
Стоит ли изучать 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
5
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не следует предполагать, что имя ресурса будет jenisSurvey, если все, что вы предоставили строителю маршрута ресурса, — это js.

Выполнив быстрый тест L10:

Route::apiResource('js', TestController::class);

php artisan route:list --path=api/js показывает:

GET|HEAD    api/js .................... js.index
POST        api/js .................... js.store
GET|HEAD    api/js/{j} ................ js.show
PUT|PATCH   api/js/{j} ................ js.update
DELETE      api/js/{j} ................ js.destroy

поэтому ваш ресурс в ваших контроллерах будет называться $j

Если вы хотите сохранить ту же структуру маршрута, вы можете перезаписать автоматически сгенерированное имя в объявлении маршрута.

Route::apiResource('js', TestController::class)->parameter('js', 'jenisSurvey');

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