为 RelatedPeople 模型解释路由资源类型时出现问题
Problem with interpreting route resource type for the RelatedPeople model
假设:我觉得是资源多元化还是模式多元化,我不确定。
我的代码:
路由网站:
Route::group(['middleware'=> 'auth'], function() {
Route::resource('relatedPersons', 'RelatedPeople\RelatedPeopleController')
->only(['store','update','destroy'])
->middleware('can:relatedPeoples');
});
注意:模型是relatedPersons,但出于测试目的,在路由定义中保留这样的relatedPersons。
相关人物(模特):
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
class RelatedPeople extends Model
{
protected $fillable = [
'name',
'phone',
'email',
'detail',
'case_report_id'
];
public function getCreatedAtAttribute($value)
{
return Carbon::parse($value)->format('Y-m-d H:m');
}
public function getDetailAttribute($value)
{
return $value ?? "Sin detalle.";
}
}
RelatedPeopleController:
<?php
namespace App\Http\Controllers\RelatedPeople;
use App\Http\Controllers\Controller;
use App\RelatedPeople;
use Illuminate\Http\Request;
class RelatedPeopleController extends Controller
{
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$rules = [
'email'=> "required|unique:related_people"
];
$this->validate($request, $rules);
$relatedPeople = RelatedPeople::create($request->all());
return response()->json($relatedPeople, 200);
}
}
使用 axios 的前端 vuejs:
onSubmit() {
let formData = new FormData(this.$refs.create)
formData.append('case_report_id', this.case_id)
axios.post('relatedPersons', formData).then( (response) => {
if ( response.status == 200 ) {
this.$emit('addRelatedPerson', response.data)
this.$toasterE.success("Related people create", { mark:1 })
this.$nextTick(() => {
this.$refs.form.reset()
this.form = form()
});
}
}).catch( (err) => {
this.exception(err)
})
}
上面的代码每次我 运行 它进入 catch 并且 returns 这个错误:
{"error": "此路由不支持 POST 方法。支持的方法:GET、HEAD、PUT、PATCH、DELETE。", "code": 405}
我已经完成的测试:
- 更改资源名称
- 在模型中添加 table name protected $ table = "related_people"
- 给controller定义一个get(index)方法就知道至少请求到了controller只有GET方法起作用,其他的都不起作用
我会继续寻找解决方案,先谢谢了。
好吧,在差点把我的脑袋炸开之后,我发现解决方案在我的脸上是错误的,不是在我绿松石色的眼睛里,而是在我的面前。
解决方法是:
前端 vuejs 与 axios(before):
onSubmit() {
let formData = new FormData(this.$refs.create)
formData.append('case_report_id', this.case_id)
axios.post('relatedPersons', formData).then( (response) => {
if ( response.status == 200 ) {
this.$emit('addRelatedPerson', response.data)
this.$toasterE.success("Related people create", { mark:1 })
this.$nextTick(() => {
this.$refs.form.reset()
this.form = form()
});
}
}).catch( (err) => {
this.exception(err)
})
}
使用 axios 的前端 vuejs(已解决):
onSubmit() {
let formData = new FormData(this.$refs.create)
formData.append('case_report_id', this.case_id)
axios.post('/relatedPersons', formData).then( (response) => {
if ( response.status == 200 ) {
this.$emit('addRelatedPerson', response.data)
this.$toasterE.success("Related people create", { mark:1 })
this.$nextTick(() => {
this.$refs.form.reset()
this.form = form()
});
}
}).catch( (err) => {
this.exception(err)
})
}
如果你还没看过,就是路由定义'/relatedPersons'
axios.post('/relatedPersons', formData).then( (response) => {
现在因为这个问题,假设我访问路径axios.post('relatedPeoples',data),应用的url是test.dev/cases/1,请求的结果将是测试。dev/cases/relatedPeoples 问题就在这里。
laravel 告诉我路由是否存在但不支持该方法。
希望我的错误对大家有帮助。
假设:我觉得是资源多元化还是模式多元化,我不确定。
我的代码:
路由网站:
Route::group(['middleware'=> 'auth'], function() {
Route::resource('relatedPersons', 'RelatedPeople\RelatedPeopleController')
->only(['store','update','destroy'])
->middleware('can:relatedPeoples');
});
注意:模型是relatedPersons,但出于测试目的,在路由定义中保留这样的relatedPersons。
相关人物(模特):
<?php
namespace App;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
class RelatedPeople extends Model
{
protected $fillable = [
'name',
'phone',
'email',
'detail',
'case_report_id'
];
public function getCreatedAtAttribute($value)
{
return Carbon::parse($value)->format('Y-m-d H:m');
}
public function getDetailAttribute($value)
{
return $value ?? "Sin detalle.";
}
}
RelatedPeopleController:
<?php
namespace App\Http\Controllers\RelatedPeople;
use App\Http\Controllers\Controller;
use App\RelatedPeople;
use Illuminate\Http\Request;
class RelatedPeopleController extends Controller
{
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$rules = [
'email'=> "required|unique:related_people"
];
$this->validate($request, $rules);
$relatedPeople = RelatedPeople::create($request->all());
return response()->json($relatedPeople, 200);
}
}
使用 axios 的前端 vuejs:
onSubmit() {
let formData = new FormData(this.$refs.create)
formData.append('case_report_id', this.case_id)
axios.post('relatedPersons', formData).then( (response) => {
if ( response.status == 200 ) {
this.$emit('addRelatedPerson', response.data)
this.$toasterE.success("Related people create", { mark:1 })
this.$nextTick(() => {
this.$refs.form.reset()
this.form = form()
});
}
}).catch( (err) => {
this.exception(err)
})
}
上面的代码每次我 运行 它进入 catch 并且 returns 这个错误: {"error": "此路由不支持 POST 方法。支持的方法:GET、HEAD、PUT、PATCH、DELETE。", "code": 405}
我已经完成的测试:
- 更改资源名称
- 在模型中添加 table name protected $ table = "related_people"
- 给controller定义一个get(index)方法就知道至少请求到了controller只有GET方法起作用,其他的都不起作用
我会继续寻找解决方案,先谢谢了。
好吧,在差点把我的脑袋炸开之后,我发现解决方案在我的脸上是错误的,不是在我绿松石色的眼睛里,而是在我的面前。
解决方法是:
前端 vuejs 与 axios(before):
onSubmit() {
let formData = new FormData(this.$refs.create)
formData.append('case_report_id', this.case_id)
axios.post('relatedPersons', formData).then( (response) => {
if ( response.status == 200 ) {
this.$emit('addRelatedPerson', response.data)
this.$toasterE.success("Related people create", { mark:1 })
this.$nextTick(() => {
this.$refs.form.reset()
this.form = form()
});
}
}).catch( (err) => {
this.exception(err)
})
}
使用 axios 的前端 vuejs(已解决):
onSubmit() {
let formData = new FormData(this.$refs.create)
formData.append('case_report_id', this.case_id)
axios.post('/relatedPersons', formData).then( (response) => {
if ( response.status == 200 ) {
this.$emit('addRelatedPerson', response.data)
this.$toasterE.success("Related people create", { mark:1 })
this.$nextTick(() => {
this.$refs.form.reset()
this.form = form()
});
}
}).catch( (err) => {
this.exception(err)
})
}
如果你还没看过,就是路由定义'/relatedPersons'
axios.post('/relatedPersons', formData).then( (response) => {
现在因为这个问题,假设我访问路径axios.post('relatedPeoples',data),应用的url是test.dev/cases/1,请求的结果将是测试。dev/cases/relatedPeoples 问题就在这里。
laravel 告诉我路由是否存在但不支持该方法。
希望我的错误对大家有帮助。