Что я делаю не так в моем контроллере, который вызывает ошибку 500? - PullRequest
0 голосов
/ 11 октября 2019

Я не могу понять, что я делаю неправильно. Я пытаюсь отправить URL файла, загруженного пользователем, в мою БД с помощью запроса axios POST, но я получаю ошибку 500.

Примечание: я использую React.js для внешнего интерфейса.

В соответствии с ошибкой в ​​моих сетевых вызовах (в журналах Laravl отображается та же ошибка), PostPicturesControllerпроблема, но я не могу обернуть голову, почему $postPictures виновник.

Что я делаю не так?

Вот PostPicturesController:

<?php

namespace App\Http\Controllers;

use App\User;
use App\PostPictures;
use Illuminate\Http\Request;

class PostPicturesController extends Controller
{
    public function create(Request $request, PostPictures $postPicture) {
        $uploadPic = $postPicture->user()->postPictures->create([
            'body' => $request->body
        ]);

        return response()->json($uploadPic->with('user')->find($uploadPic->id));
    }
}

Вот User.php:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function postPictures() {
        return $this->hasMany(PostPictures::class);
    }
}

Вот axios call:

submitImageAndRedirect() {
    let picUrl = this.state.previewImgURL;
    axios.post('/home', {
        body: picUrl
    }).then(response => {
        // console
        console.log(response);
        // set state
        this.setState({
            pictures: [picUrl, response.data]
        });
    });
}

Вот мои маршруты в web.php:

<?php

Auth::routes();

Route::group(['middleware' => ['auth']], function () {
    Route::get('/', "HomeController@index")->name('home');
    Route::get('/home', "HomeController@index")->name('home');
    Route::post('/home', 'PostPicturesController@create')->name('home');
});

внутри моих сетевых вызовов:

{message: "Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$postPictures",…}
exception: "ErrorException"
file: "/Users/name/workstation/website/app/Http/Controllers/PostPicturesController.php"
line: 12
message: "Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$postPictures"

1 Ответ

0 голосов
/ 11 октября 2019

В этой строке:

 public function create(Request $request, PostPictures $postPicture) { ... }

Вы пытаетесь внедрить модель PostPictures по маршруту. Но вы не привязали входящую модель к этому маршруту.

Вы можете сделать это, используя переменную на вашем маршруте, примерно такую:

Route::post('/home/{postPicture}', 'PostPicturesController@create')->name('home');

, где переменная маршрута соответствует введенной переменнойточно на контроллере.

Но, если вы отправляете идентификатор напрямую через объект данных, может быть проще просто загрузить переменную $request, а затем вытащить id, а затем модельс этим идентификатором в вашем методе.

К сожалению, я не уверен, что любой из них будет работать так, как вы хотите. Я не совсем уверен, что вы пытаетесь сделать с помощью этого метода создания. Если вы пытаетесь создать новую модель PostPictures - то, что должен вводить Laravel? IE, если еще нет модели, как вы можете извлечь ее из базы данных? По соглашению, обычно этот метод не имеет входящего id, но вы должны показать форму или что-то еще, чтобы создать новую модель здесь и сохранить ее в методе store. Как вы понимаете, это выглядит как цикл (postpicture -> user -> postpicture).

Суть в том, что ошибка, скорее всего, происходит, потому что этому методу не отправлено ничего, что позволило бы ввести модель - нет идентификатора = нет $postPicture

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

public function store(Request $request) {
    $uID = \Auth::user()->id;
    $uploadPic = PostPicture::create([
        'body' => $request->get('body')
        'user_id' => $uID    // assuming user_id is the fk
    ]);

    // If you want to load the user on the new object:
    $uploadPic->load('user');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...