php - 我在控制器中做错了什么导致 500 错误?
问题描述
我不明白我到底做错了什么。我正在尝试通过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"
解决方案
在这一行:
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');
推荐阅读
- laravel-5.7 - [] rabbitmq 队列没有连接器
- javascript - 关闭 iframe 打印对话框时如何刷新页面
- fortran - OpenMP 中并行块内的关键部分
- java - DateTimeFormatter 无法在 Java 8 中解析带十进制 0 的日期
- c++ - 找出如何修复 C++ Blackjack 程序的问题
- python - dict.copy 中的 Python KeyError
- python - Pandas - 为所有行(特别是)重复行提供唯一标识符
- html - Html 输入数字没有得到数字键盘输入
- multi-tenant - 没有数据同步代理的混合数据库同步
- php - 来自 php 的 SOAP 请求不起作用并给出错误:HTTP-Internal Server Error