我的控制器在做什么导致500错误?

时间:2019-10-11 00:50:24

标签: php reactjs laravel debugging axios

我不明白我在做什么错。我正在尝试通过axios POST请求将用户上传的文件的URL发送到我的数据库中,但是出现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通话:

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 :(得分:0)

在这一行:

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

您正尝试通过该路线注入 PostPictures 模型。但是您尚未将传入模型绑定到该路线。

您可以在路线上使用变量来执行以下操作:

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

路由变量与控制器上注入的变量完全匹配。

但是,如果您直接通过数据对象发送ID,则只需加载$request变量,然后提取id,然后提取具有该ID的模型,可能会更容易,在您的方法之内。

不幸的是,我不确定这两种方法是否都能如您所愿。我不确定您要使用此create方法做什么。如果您尝试创建新的PostPictures模型-那么Laravel应该注入什么? IE如果还没有模型,如何从数据库中提取模型?按照惯例,通常不会传入id,但是您会在此处显示一个表单或用于创建新模型的内容并将其存储在store方法中。有了它,看起来有点像一个循环(postpicture-> user-> postpicture)。

最重要的是,错误很可能发生,因为没有任何东西发送到该方法以允许模型被注入-no id = no $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');