假设我有一个简单的刀片视图表单,其中只有一个输入字段和一个提交按钮。在此字段中,您只需要写一个名字。之后,您需要单击提交按钮以进行api调用。
为简化起见,假设api调用是method:post和url:'api / user'
调用api在数据库中创建一个新用户,并使用json响应:
{
"id": 1,
"name": "Im a new user",
"created_at": 20190119
}
据我所知,是否实现了我的blade.view,如下所示:
<form method="POST" action="/api/user">
@csrf
<div class="form-group row">
<label for="username"
class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
<div class="col-md-6">
<input id="username" type="text"
class="form-control"
name="username" value="{{ old('username') }}" required autofocus>
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Create') }}
</button>
</div>
</div>
</form>
我的页面显示响应。 我想要的是停留在实际视图上并将响应显示为警报,例如$ name。 “已创建”
Api路由(routes / api.php):
Route::post('/user', 'UserController@createUser');
路由配置(routes / web.php):
Route::get('/user' , function () {
return view('user/create-user');
});
我知道可以使用的解决方案
重定向到同一页面(这意味着再次重新渲染同一页面,这并不是真正的责任-此解决方案导致重新加载整个页面)
在UserController @ createUser方法中使用数据返回相同的视图(与上述相同,据我所知,api调用应使用json而不是视图进行响应)
我也可以通过例如使用Ajax jQuery的。如您所见,有很多解决方案,但是哪种是最好的。
在这种情况下,您可以说有最佳做法吗?
laravel提供了一些好的解决方案吗?
答案 0 :(得分:0)
我认为您缺少一些内容,或者不妨进一步研究各个部分的组合方式。您的主要要求不是特别是Laravel项目:
我想要停留在实际视图中,并将响应显示为警报
问题的症结不是Laravel带来的“开箱即用”,它实际上不是Laravel的问题,而是我如何异步更新页面。为此,您可能最适合使用ajax请求和javascript / jQuery警报。
我可能会这样:
$('#submitButton').on('click', function (e) {
e.preventDefault(); // Want to stay on the page, not go through normal form
// Might be easier to make this a NON submit button - then we can use the rest below and not have to js submit()
// Grab any extra info via data.
var item_type = $(this).data('item-type');
var name = $(this).val();
$.ajax({
url: "{{url('user/create/')}}",
type: "POST",
data: {
item_type: item_type,
name: name
},
success: function (name) {
alert(message);
// Or, if you want a better looking alert, you can use a library like SWAL:
swal("Success!", "New user created with a name of: "+name, "success");
},
error: function () {
swal("Error", "Unable to bring up the dialog.", "error");
}
});
});
您需要在控制器中处理ajax数据,并仅在控制器方法的return语句中发送回名称。
如果您想更改上面的表单并且不通过警报来执行此操作,请在成功函数中使用jQuery进行更改(例如$("#name").text(name);
或类似的内容。