我正在创建一些小API,我可以通过邮递员创建博客文章。我使用laravel 5,我遇到了一个问题。
在API调用中,我可以指定用户ID,因此帖子是由其他人编写的,而不是现在进行API调用的人。我当前登录的用户在邮递员中使用令牌指定。
所以现在我的问题是,当我创建API调用并将我的user_id指定为空字符串时 " userID":""
它会抛出一个错误,因为我指定id是一个像这样的int
'userID' => ['integer']
错误是
"Type error: Argument passed to construct() must be of the type integer or null, string given",
为什么接受空字符串?我该如何正确验证? 请注意,不必在post请求中指定userID。如果未指定,它将从您当前登录的用户那里获取。 (在令牌中指定)
答案 0 :(得分:3)
一起使用两个验证规则将解决问题。
required
和integer
如你所说,你不想强制要求:
使用这些验证规则组合:
nullable|integer
答案 1 :(得分:1)
我遇到了这个问题。所以,我在 laravel 文档中找到了这个描述:
“默认情况下,当被验证的属性不存在或包含空字符串时,不会运行正常的验证规则,包括自定义扩展。”
所以...当你有一个空字符串数据的属性时,正常的验证规则不会被执行。
所以...我有一个想法来解决这个问题,即在我的模型中覆盖函数 setAttribute:
public function setAttribute($key, $value)
{
parent::setAttribute($key, $value);
if (is_string($value))
{
$this->attributes[$key] = empty(trim($value)) ? null : $value;
}
}
所以...所有时间都必须在您的数据库中保存模型,空值将被转换为空值。
因此,如果数据为空或整数,则使用“可空|整数”规则来使用验证规则。如果数据为空字符串,则不考虑验证规则,但会先将数据转换为空字符串,然后再保存到数据库中。
我使用 setAttribute 方法创建了我的 BaseModel(抽象类),并且我的所有模型都继承了这个类。
abstract class BaseModel extends Model
{
public function setAttribute($key, $value)
{
parent::setAttribute($key, $value);
if (is_string($value))
{
$this->attributes[$key] = empty(trim($value)) ? null : $value;
}
} ...
答案 2 :(得分:-1)
您需要将userId字段设为:
begin
rollback; --clear all Transactions
execute immediate 'begin
savepoint SPX;
end;';
rollback to savepoint SPX;
end;