I have the following JSON payload inside my POST request to Lumen:
{ "array":
[
{"title":"my blogADD","description":"myblogdescriptionADD","status":1},
{"title":"my blogUPDATEDADD","description":"myblogdescriptionUPDATEDADD","status":1},
{"title":"my blog33ADD","description":"myblogdescription33ADD","status":1}
]
}
The POST calls the following endpoint in my Controller:
$this->validate($request, [
'array' => 'present|array',
'array.*.title' => 'required',
'array.*.description' => 'required'
]);
For Completeness, here is the full Code of my 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();
}
}
Now, when I make the request, I get the following error:
(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
I got the above syntax for both my code and the JSON Request from the SO answer of Michael Aaron Wilson here: Laravel validate array of object json
It wasnt the accepted answer but it seemed more fit for my problem than the accepted answer. But maybe I'm wrong here, I'm pretty new to lumen and I'm currently facing the most problems when using the lumen helper ->validate()
Maybe someone of you can tell me whether the proposed solution in the referenced question is already wrong or if my code is wrong or my JSON array of objects.
EDIT: The debugging of my $request renders the following result:
^ 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"
}