首页 > 解决方案 > 为什么 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"
}

标签: phpjsonlaravellumen

解决方案


推荐阅读