Как мне исправить ошибку «Вызов функции-члена update() при null»?

#php #laravel

#php #laravel

Вопрос:

Я пытаюсь извлечь входные данные из формы в базу данных, чтобы запустить операцию обновления. Однако это ошибка, которая указывает непосредственно на строку «$obj-> update(request()-> all());». Ошибка заключается в «вызове функции-члена update () при null». Я не слишком уверен, что означает эта ошибка, но я думаю, это означает, что request()-> all() имеет значение null. Я хочу, чтобы результат был таким: после обновления пользовательского ввода в базу данных пользователь будет перенаправлен на pageManagement.blade.php с помощью обратного перенаправления (‘/ p’); Однако текущий вывод — это просто сообщение об ошибке, в котором указано «Вызов функции-члена update() при null».

 public function update($URI)
{
    $data = request()->validate([
        'title' => 'required',
        'URI' => 'required|min:5|max:10',
        'pageContent' => 'required'
    ]);
    $obj = AppPage::find($URI);
    $obj->update(request()->all());
    return redirect('/p');
}
  

Это моя модель Page.php .

 class Page extends Model
{
    protected $fillable = ['title', 'URI', 'pageContent'];
}
  

Это мой маршрут в web.php .

 Route::patch('/page/{URI}','PageController@update');
  

Это моя форма для ввода пользователем входных данных.

 <form action="/page/{{ $pageContent->URI }}" method="post">
@csrf
@method('PATCH')
  <label for="title">Title:</label><br>
  <input type="text" id="title" name="title" autocomplete="off" value="{{ $pageContent -> title 
}}"><br>
  @error('title') <p style="color: red">{{ $message }}</p> @enderror
  <label for="URI">URI:</label><br>
  <input type="text" id="URI" name="URI" autocomplete="off" value="{{ $pageContent -> URI }}"> 
  

@error(‘URI’) {{ $message }}

@enderror Содержимое страницы:
PageContent }}»> @error(‘PageContent’) {{ $message }}

@enderror tinymce.init({ селектор:’#PageContent’ })

Мой репозиторий GitHub прикреплен ниже, потому что форматирование вопроса для формы выглядит немного испорченным…

https://github.com/xiaoheixi/wfams

Спасибо, что прочитали мой вопрос! 😀

Комментарии:

1. Ошибка «Вызов функции-члена update () при null» означает, что $obj имеет значение null. Кажется, $obj = App Page::find ($ URI); не вернул то, что вы ожидали

2. Вы вызываете request(), но в этой функции вы не используете Request, public function update($URI) поэтому измените на public function update(Request $request, $URI)

3. Конечно, я собираюсь изменить это сейчас.

4. Я изменил его, но он все еще не работает.

5. После изменения какой ошибки вы получаете?

Ответ №1:

Вы используете запрос, поэтому вам нужно вызвать запрос в вашей функции для update() метода, который вы можете использовать where() вместо этого :

 public function update(Request $request)
{
    $data = $request->validate([
        'title' => 'required',
        'URI' => 'required|min:5|max:10',
        'pageContent' => 'required'
    ]);

    $obj = AppPage::where('URI', $request->URI)
        ->update([
            'title' => $request->title, 
            'pageContent' => $request->pageContent
        ]);

    return redirect('/p');
}
  

Смотрите официальную документацию здесь здесь

Комментарии:

1. он может изменить ‘URI’ @sta, вы можете использовать привязку модели маршрута

2. Я пытался посмотреть видео YouTube о привязке модели маршрута, я действительно не понимаю, и пробовал все около 5 часов о привязке модели маршрута и не работает.

3. @DwarfChampion добавил ответ для использования в качестве практического кода

4. @lagbox есть две причины. Они вызывают запрос, но не определили его для функции. И метод find() с помощью глухого поиска id в таблице, верно? Они вызывают поле, URI которое является строкой, поэтому find() здесь ничего не могут сделать.

5. В методе find() нет метода update() напрямую, но обновление () может быть возможно с помощью метода fill() в find(). В любом случае, я обновил свой ответ.

Ответ №2:

я рекомендую вам проверить существование URI, используя правило проверки «существует«:

   $data = request()->validate([
        'title' => 'required',
        'URI' => 'required|min:5|max:10|exists:pages,URI',
        'pageContent' => 'required'
    ]);
  

теперь, если URI не существует в вашей таблице pages, laravel вернет ошибку проверки с сообщением типа «указанный URI не существует на страницах таблицы»

Комментарии:

1. У меня проблема, в нем говорится, что ошибка теперь «Неопределенная переменная: URI».

2. php artisan route:list , найдите свой маршрут ‘страница/’ и убедитесь, что имя параметра отправлено в метод обновления

3. @OMR я предполагаю, что он не установил getRouteKeyName() в ‘URI’

Ответ №3:

я видел ваш github https://github.com/xiaoheixi/myFirstWebsite

пример использования привязки модели в контроллере :

 Route::patch('/page/{URI}','PageController@update');
  
 Route::get('{URI}', 'PageController@getPage');
  
 public function update($URI)
{
    $data = request()->validate([
        'title' => 'required',
        'URI' => 'required|min:5|max:10',
        'pageContent' => 'required'
    ]);
    $obj = AppPage::find($URI);
    $obj->update(request()->all());
    return redirect('/p');
}
  

измените контроллер на :

 use AppPage;

public function getPage(Page $URI)
{
    return view('page_view', compact('URI'));
}

public function update(Request $request, Page $URI)//match $URI to {URI}
{
    $data = $request->validate([
        'title' => 'required',
        'URI' => 'required|min:5|max:10|unique:pages,URI,'.$URI->id, //you dont want a duplicate URI when you search a page by URI
        'pageContent' => 'required'
    ]);
    
    $URI->update($request->all());
    return redirect('/p');
}
  

в блейде:

 <form action="/page/{{ $pageContent }}" method="post">
  

в модели:

 use IlluminateDatabaseEloquentModel;

class Page extends Model
{
    protected $fillable = ['title', 'URI', 'pageContent'];
    public function getRouteKeyName()
    {
        return 'URI';
    }
}
  

Ответ №4:

Ошибка означает, что find возвращено null . Что имеет смысл, поскольку find будет пытаться выполнить поиск по полю первичного ключа, а не по URI полю.

Я бы не использовал URI в качестве идентификатора для этой записи. Я бы использовал это id .

 <form action="/page/{{ $pageContent->id }}" method="post">

Route::patch('/page/{page}','PageController@update');
  

Это немного упростило бы ситуацию. Теперь вы можете легко использовать привязку модели маршрута, чтобы получить это Page для вас:

 use AppPage;
...

public function update(Page $page)
{
    $data = request()->validate([
        'title' => 'required',
        'URI' => 'required|min:5|max:10',
        'pageContent' => 'required'
    ]);

    $page->update(request()->all());

    return redirect('/p');
}
  

Это гарантирует, что $page это существующий экземпляр модели. Поскольку это будет так, вы можете вызвать update это. Просто убедитесь, что title , URI и pageContent являются «заполняемыми».