php - 为什么 Lumen 采用数组到字符串的转换?
问题描述
我对 Lumen 的 POST 请求中有以下 JSON 有效负载:
{ "array":
[
{"title":"my blogADD","description":"myblogdescriptionADD","status":1},
{"title":"my blogUPDATEDADD","description":"myblogdescriptionUPDATEDADD","status":1},
{"title":"my blog33ADD","description":"myblogdescription33ADD","status":1}
]
}
POST 在我的控制器中调用以下端点:
$this->validate($request, [
'array' => 'present|array',
'array.*.title' => 'required',
'array.*.description' => 'required'
]);
为了完整性,这里是我的 ArticleController.php 的完整代码:
<?php
namespace App\Http\Controllers;
use App\Article;
use Illuminate\Http\Request;
class ArticleController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//
}
//
public function showAllArticles(){
return response()->json(Article::get(['title', 'description', 'status'])); // ::get([]) spezifiziert die zu referenzierenden Attribute
// ::all() referenziert alle Attribute einer Tabelle/Relation
}
public function showOneArticle($id){
return response()->json(Article::find($id));
}
public function create(Request $request){
$this->validate($request, [
'array' => 'present|array',
'array.*.title' => 'required',
'array.*.description' => 'required'
]);
//dd($request->all());
/*
$this->validate($request, [
'title' => 'required',
'description' => 'required'
]);*/
//insert record
//$article = Article::create($request->all());
Article::insert($request->all());
//return response()->json($article, 201);
}
public function update($id, Request $request){
$this->validate($request, [
'title' => 'required',
'description' => 'required'
]);
$article = Article::findOrFail($id);
$article->update($request->all());
return response()->json($article, 200);
}
public function delete($id, Request $request){
Article::findOrFail($id)->delete();
return response('Deleted Successfully', 200);
}
public function resetRecords(Request $request){
Article::where('id', '>', 2)->delete();
}
}
现在,当我提出请求时,我收到以下错误:
(1/1) ErrorException
Array to string conversion
in Str.php line 394
at Application->Laravel\Lumen\Concerns\{closure}(8, 'Array to string conversion', 'E:\\LumenTut\\firstTut\\vendor\\illuminate\\support\\Str.php', 394, array('search' => '?', 'replace' => array(array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)), 'subject' => 'insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)', 'segments' => array(', ', ', ', ')'), 'result' => 'insert into `articles` (`0`, `1`, `2`) values (', 'segment' => ', '))in Str.php line 394
at Str::replaceArray('?', array(array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)), 'insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)')in QueryException.php line 56
at QueryException->formatMessage('insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)', array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)), object(PDOException))in QueryException.php line 39
at QueryException->__construct('insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)', array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)), object(PDOException))in Connection.php line 666
at Connection->runQueryCallback('insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)', array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)), object(Closure))in Connection.php line 625
at Connection->run('insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)', array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)), object(Closure))in Connection.php line 460
at Connection->statement('insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)', array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)))in Connection.php line 412
at Connection->insert('insert into `articles` (`0`, `1`, `2`) values (?, ?, ?)', array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)))in Builder.php line 2626
at Builder->insert(array('array' => array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1))))in Builder.php line 1350
at Builder->__call('insert', array(array('array' => array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)))))in ForwardsCalls.php line 23
at Model->forwardCallTo(object(Builder), 'insert', array(array('array' => array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)))))in Model.php line 1618
at Model->__call('insert', array(array('array' => array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)))))in Model.php line 1630
at Model::__callStatic('insert', array(array('array' => array(array('title' => 'my blogADD', 'description' => 'myblogdescriptionADD', 'status' => 1), array('title' => 'my blogUPDATEDADD', 'description' => 'myblogdescriptionUPDATEDADD', 'status' => 1), array('title' => 'my blog33ADD', 'description' => 'myblogdescription33ADD', 'status' => 1)))))in ArticleController.php line 51
at ArticleController->create(object(Request))
at call_user_func_array(array(object(ArticleController), 'create'), array(object(Request)))in BoundMethod.php line 32
at BoundMethod::Illuminate\Container\{closure}()in Util.php line 34
at Util::unwrapIfClosure(object(Closure))in BoundMethod.php line 90
at BoundMethod::callBoundMethod(object(Application), array(object(ArticleController), 'create'), object(Closure))in BoundMethod.php line 34
at BoundMethod::call(object(Application), array(object(ArticleController), 'create'), array(), null)in Container.php line 590
at Container->call(array(object(ArticleController), 'create'), array())in RoutesRequests.php line 376
at Application->callControllerCallable(array(object(ArticleController), 'create'), array())in RoutesRequests.php line 342
at Application->callLumenController(object(ArticleController), 'create', array(true, array('uses' => 'App\\Http\\Controllers\\ArticleController@create'), array()))in RoutesRequests.php line 316
at Application->callControllerAction(array(true, array('uses' => 'App\\Http\\Controllers\\ArticleController@create'), array()))in RoutesRequests.php line 278
at Application->callActionOnArrayBasedRoute(array(true, array('uses' => 'App\\Http\\Controllers\\ArticleController@create'), array()))in RoutesRequests.php line 263
at Application->handleFoundRoute(array(true, array('uses' => 'App\\Http\\Controllers\\ArticleController@create'), array()))in RoutesRequests.php line 165
at Application->Laravel\Lumen\Concerns\{closure}(object(Request))in RoutesRequests.php line 416
at Application->sendThroughPipeline(array(), object(Closure))in RoutesRequests.php line 171
at Application->dispatch(null)in RoutesRequests.php line 108
at Application->run()in index.php line 28
我从 Michael Aaron Wilson 的 SO 回答中得到了我的代码和 JSON 请求的上述语法: Laravel validate array of object json
这不是公认的答案,但它似乎比公认的答案更适合我的问题。但也许我在这里错了,我对 lumen 很陌生,我目前在使用 lumen 助手时面临最多的问题 ->validate()
也许你们中的某个人可以告诉我所引用问题中建议的解决方案是否已经错误,或者我的代码是否错误或我的 JSON 对象数组。
编辑:我的 $request 的调试呈现以下结果:
^ Laravel\Lumen\Http\Request {#49
#json: Symfony\Component\HttpFoundation\ParameterBag {#41
#parameters: array:1 [
"array" => array:3 [
0 => array:3 [
"title" => "my blogADD"
"description" => "myblogdescriptionADD"
"status" => 1
]
1 => array:3 [
"title" => "my blogUPDATEDADD"
"description" => "myblogdescriptionUPDATEDADD"
"status" => 1
]
2 => array:3 [
"title" => "my blog33ADD"
"description" => "myblogdescription33ADD"
"status" => 1
]
]
]
}
#convertedFiles: null
#userResolver: Closure($guard = null) {#32
class: "Laravel\Lumen\Application"
this: Laravel\Lumen\Application {#3 …}
}
#routeResolver: Closure() {#38
class: "Laravel\Lumen\Application"
this: Laravel\Lumen\Application {#3 …}
}
+attributes: Symfony\Component\HttpFoundation\ParameterBag {#51
#parameters: []
}
+request: Symfony\Component\HttpFoundation\ParameterBag {#41}
+query: Symfony\Component\HttpFoundation\ParameterBag {#57
#parameters: []
}
+server: Symfony\Component\HttpFoundation\ServerBag {#53
#parameters: array:42 [
"DOCUMENT_ROOT" => "E:\LumenTut\firstTut\public"
"REMOTE_ADDR" => "127.0.0.1"
"REMOTE_PORT" => "55949"
"SERVER_SOFTWARE" => "PHP 7.3.10 Development Server"
"SERVER_PROTOCOL" => "HTTP/1.1"
"SERVER_NAME" => "localhost"
"SERVER_PORT" => "8080"
"REQUEST_URI" => "/api/articles"
"REQUEST_METHOD" => "POST"
"SCRIPT_NAME" => "/index.php"
"SCRIPT_FILENAME" => "E:\LumenTut\firstTut\public\index.php"
"PATH_INFO" => "/api/articles"
"PHP_SELF" => "/index.php/api/articles"
"HTTP_HOST" => "localhost:8080"
"HTTP_USER_AGENT" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0"
"HTTP_ACCEPT" => "*/*"
"HTTP_ACCEPT_LANGUAGE" => "en-US,en;q=0.5"
"HTTP_ACCEPT_ENCODING" => "gzip, deflate"
"CONTENT_TYPE" => "application/json"
"HTTP_CONTENT_TYPE" => "application/json"
"CONTENT_LENGTH" => "281"
"HTTP_CONTENT_LENGTH" => "281"
"HTTP_DNT" => "1"
"HTTP_CONNECTION" => "keep-alive"
"REQUEST_TIME_FLOAT" => 1575013707.0195
"REQUEST_TIME" => 1575013707
"APP_NAME" => "Lumen"
"APP_ENV" => "local"
"APP_KEY" => ""
"APP_DEBUG" => "true"
"APP_URL" => "http://localhost"
"APP_TIMEZONE" => "UTC"
"LOG_CHANNEL" => "stack"
"LOG_SLACK_WEBHOOK_URL" => ""
"DB_CONNECTION" => "mysql"
"DB_HOST" => "127.0.0.1"
"DB_PORT" => "3306"
"DB_DATABASE" => "firstTut"
"DB_USERNAME" => "root"
"DB_PASSWORD" => ""
"CACHE_DRIVER" => "file"
"QUEUE_CONNECTION" => "sync"
]
}
+files: Symfony\Component\HttpFoundation\FileBag {#54
#parameters: []
}
+cookies: Symfony\Component\HttpFoundation\ParameterBag {#52
#parameters: []
}
+headers: Symfony\Component\HttpFoundation\HeaderBag {#55
#headers: array:9 [
"host" => array:1 [
0 => "localhost:8080"
]
"user-agent" => array:1 [
0 => "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0"
]
"accept" => array:1 [
0 => "*/*"
]
"accept-language" => array:1 [
0 => "en-US,en;q=0.5"
]
"accept-encoding" => array:1 [
0 => "gzip, deflate"
]
"content-type" => array:1 [
0 => "application/json"
]
"content-length" => array:1 [
0 => "281"
]
"dnt" => array:1 [
0 => "1"
]
"connection" => array:1 [
0 => "keep-alive"
]
]
#cacheControl: []
}
#content: """
{ "array":
[
{"title":"my blogADD","description":"myblogdescriptionADD","status":1},
{"title":"my blogUPDATEDADD","description":"myblogdescriptionUPDATEDADD","status":1},
{"title":"my blog33ADD","description":"myblogdescription33ADD","status":1}
]
}
"""
#languages: null
#charsets: null
#encodings: null
#acceptableContentTypes: null
#pathInfo: "/api/articles"
#requestUri: "/api/articles"
#baseUrl: ""
#basePath: null
#method: "POST"
#format: null
#session: null
#locale: null
#defaultLocale: "en"
-preferredFormat: null
-isHostValid: true
-isForwardedValid: true
basePath: ""
format: "html"
}
解决方案
推荐阅读
- python - 几个小时后,Django 图像和内容消失了
- android - 如何解谜
values.xml 中的错误? - python - 将 argparse 与格式化的位置参数一起使用
- mongodb - 如何创建具有可变日期的部分索引?
- winforms - 循环没有完全显示所有元素
- python - 如何使用 environtment.yml 文件将带有 pip 的本地库安装到 conda 环境?
- javascript - 使用纯(香草)JS 在画布的 X、Y 坐标处触发点击事件
- html - 如何修复“可下载字体:被消毒剂拒绝”
- java - 将字符串输入数组,然后将字符串拆分为单个字符数组
- jquery - 使用 html/css 的正文高度和水平滚动