要求是更新用户角色。该字段可以为空(留空),一个或多个,如表单字段roles[]
中提供的那样。
以下是视图表单:
@foreach ($roles as $role)
<div class="checkbox">
<label><input name="roles[]" type="checkbox" value="{{$role->id}}" {{ $user->roles->contains($role->id) ? 'checked' : '' }}>{{$role->name}}</label>
</div>
@endforeach
UserController :: update()中的条件是:
if ($request->roles) {
// update user roles
}
除了一个案例外,一切正常。有时用户必须没有任何角色。
if($request->roles)
,isset($request->roles)
和!empty($request->roles)
..都提供相同的旧式回复(null
,''
,true/flase
)
案例:当分配了一个或多个角色时:
+request: ParameterBag {#41 ▼
#parameters: array:6 [▼
"_method" => "PUT"
"_token" => "a8oIPQFBMbhjanikX8v83qeOcfRE0N4UKTcTQDig"
"name" => "New User Name"
"email" => "newuser@testserver.asap"
"password" => ""
"roles" => array:2 [▼
0 => "2"
1 => "3"
]
]
}
案例:当没有分配角色或需要删除(分离)先前分配的角色时:
+request: ParameterBag {#41 ▼
#parameters: array:5 [▼
"_method" => "PUT"
"_token" => "a8oIPQFBMbhjanikX8v83qeOcfRE0N4UKTcTQDig"
"name" => "New User Name"
"email" => "newuser@testserver.asap"
"password" => ""
]
}
所以问题(要求)是:
如何区分HTML Post表单的字段值是否已提交为空(在此处取消选中)或视图表单中是否存在此类字段?
在Laravel中是否有一种雄辩的方式来查找/列出来自Request
对象的表单文件?
[PS:尝试另一个隐藏的领域或做一些前端jQuery将不胜感激]
答案 0 :(得分:4)
您可以使用laravel请求方法has()
或filled()
,has
检查参数是否存在且filled
检查它是否存在和填充:
if ($request->has('roles')) {
//
}
或
if ($request->filled('roles')) {
//
}
检查Laravel documentation以获取有关从请求对象检索输入的更多详细信息。
修改强>
由于您使用的是Laravel 5.2,因此适用以下规则:
has()
方法检查参数是否存在和已填充。exists()
方法检查参数是否存在。检查回购中的the code以获取更多信息。
答案 1 :(得分:2)
您需要在应用程序的设计中识别此问题。
如何区分HTML Post表单的字段值是否已提交为空(未选中此处)或视图表单中是否存在此类字段?在Laravel中是否有一种雄辩的方法来从Request对象中查找/列出表单文件?
该表单何时不应包含roles[]
字段?您应该有一个标记,告诉您的应用程序此表单没有roles[]
字段。
有些事情,当普通用户更新他/她的个人资料时使用此表格时,他/她将无法更新他/她的角色。
因为您的问题确实是表单的默认行为,正如此问题中所回答:Submit an HTML form with empty checkboxes
因此,不具备的表单将有一个不同的流程,其中已经一个角色字段的表单具有角色字段和不同的流程。
要添加到您的实现,您可以检索角色字段,如下所示:
$roles = $request->input('roles', []);
之后,您可以将sync
用于模型的关系方法。
$user->roles()->sync($roles);
答案 2 :(得分:1)
为此,您有validations,似乎您需要roles
字段为required
和exists
(以映射到某个表格)
您只需要通过artisan命令创建验证器并将其注入控制器方法,查看文档。
例如:
php artisan make:request MyCustomRequest
然后你应该有一个请求文件:App\Http\Requests
您需要如上所述设置验证规则:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class MyCustomRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'rules' =>'required|exists:tour_roles_table,id'
];
}
}
然后你可以用你想要的方法注入它:
class UserController extends Controller {
[...]
public function update(MyCustomRequest $req)
{
[...]
//at this point validation was successfull, by default Laravel will redirect back with error messages, which can be customized in your request object
}
[...]
}
答案 3 :(得分:0)
尝试if(empty())
$check = request::get('roles');
if(empty($checkbox)){
//if checkbox have a empty value do ...
}else{
//if checkbox have not empty value do ..
}