测试 RESTful API (Lumen) - http/https 协议是问题所在吗?

Testing RESTful API (Lumen) - is the http/https protocol the problem?

我正在学习本教程 https://www.youtube.com/watch?v=6Oxfb_HNY0U 建立一个小流明测试项目。 我目前在第 27 分钟,您应该通过 post 请求插入一条记录。 为此,我使用 RESTClient http://restclient.net/

所以,最后一天我已经尽力解决了这个问题,多亏了SO,我至少也可以 部分解决问题:

但是,我仍然收到错误而不是新记录。 向

发送 post 请求时
http://localhost:8080/api/articles

我收到这个错误:

 (1/1) BadMethodCallException

Method Laravel\Lumen\Http\Request::validate does not exist.
in Macroable.php line 103
at Request->__call('validate', array(array('title' => 'required', 'description' => 'required')))in ArticleController.php line 36
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

由于我是 Lumen/Laravel 的新手,我发现很难从这个错误中猜出任何内容。 我不知道我是否只是拼写错误,没有注意范围或类似的东西。

现在,这里是产生这个错误的代码: web.php(路由),Article.php(模型,驻留在应用程序文件夹中)和 ArticleController.php(控制器):

web.php:

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It is a breeze. Simply tell Lumen the URIs it should respond to
| and give it the Closure to call when that URI is requested.
|
*/

$router->get('/', function () use ($router) {
    return $router->app->version();
});
//                was simply 'api' in tutorial
$router->group(['prefix' => '/api'], function($router){
  $router->get('articles', 'ArticleController@showAllArticles');
  $router->get('articles/{id}', 'ArticleController@showOneArticle');
  $router->post('articles', 'ArticleController@create');
});

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){
      //dd($request); //for debugging whether the request is actually being processed

      $validatedData = $request->validate([
        'title' => 'required',
        'description' => 'required',
      ]);


      //dd($request); //for debugging whether the specified fields are required
      //insert record

      $article = Article::create($request->all());
      return response()->json($article, 201);

    }


}

Article.php:

<?php

namespace App;


use Illuminate\Database\Eloquent\Model;

class Article extends Model
{

    protected $fillable = [
        'title', 'description', 'status'
    ];

}

由于此代码中的函数 "create()" 与教程代码相比有所修改(参见顶部引用的 SO 问题中 ege 的回答),我也尝试了教程代码,其中create() 函数如下所示:

public function create(Request $request){

  $this->validation($request, [
    'title' => 'required',
    'description' => 'required'
  ]);


  $article = Article::create($request->all());
  return response()->json($article, 201);

}

我又收到另一个错误,在这种情况下:

 (1/1) Error

Call to undefined method App\Http\Controllers\ArticleController::validation()
in ArticleController.php line 41
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

我在理解错误方面基本上遇到了与第一个错误相同的问题。 我在这里查看了流明文档: https://lumen.laravel.com/docs/6.x/validation

我又想知道我是否没有正确理解范围("this" 在这里指的是什么,它是什么对象,我实际上可以从中调用什么方法?)。

为了完整起见,我引用 table 模型 "Article" 的 table 的屏幕截图: https://imgur.com/onXEgzg

总的来说,我只是一无所知,如果有人可以,我将非常感激"give me a lift" ^^

查看您的修改示例(您的 create() 方法的第二个版本),错误的第一行显示了问题:

Call to undefined method App\Http\Controllers\ArticleController::validation()

所以您的代码中的这一行有问题:

$this->validation() ...

检查 the link to the Lumen docs 您包括:

The $this->validate helper which is available in Lumen ...

所以有一个 validate() 帮助程序 - 但您正在使用 validation()