Dingo API 中 Request 如果验证成功会执行两次,如何解决?

如题:

Laravel 6.4

Dingo API 2.4

https://github.com/dingo/api/issues/1668

宇宙最厉害
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
宇宙最厉害
最佳答案

原因找到了。因为框架和插件都使用了
vendor/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider.php
vendor/dingo/api/src/Provider/LaravelServiceProvider.php

$this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) {
    $resolved->validateResolved();
});

$this->app->resolving(FormRequest::class, function ($request, $app) {
    $request = FormRequest::createFrom($app['request'], $request);

    $request->setContainer($app)->setRedirector($app->make(Redirector::class));
});

方案一

回滚到2.2.3版本

方案二

app.php

// Illuminate\Foundation\Providers\FoundationServiceProvider::class,
App\Providers\FoundationServiceProvider::class,

app/providers/FoundationServiceProvider.php

namespace App\Providers;

use Illuminate\Foundation\Providers\FoundationServiceProvider as LaravelFoundationServiceProvider;

class FoundationServiceProvider extends LaravelFoundationServiceProvider
{
    /**
     * The provider class names.
     *
     * @var array
     */
    protected $providers = [
        // FormRequestServiceProvider::class,
    ];
}
4年前 评论
讨论数量: 4
宇宙最厉害

原因找到了。因为框架和插件都使用了
vendor/laravel/framework/src/Illuminate/Foundation/Providers/FormRequestServiceProvider.php
vendor/dingo/api/src/Provider/LaravelServiceProvider.php

$this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) {
    $resolved->validateResolved();
});

$this->app->resolving(FormRequest::class, function ($request, $app) {
    $request = FormRequest::createFrom($app['request'], $request);

    $request->setContainer($app)->setRedirector($app->make(Redirector::class));
});

方案一

回滚到2.2.3版本

方案二

app.php

// Illuminate\Foundation\Providers\FoundationServiceProvider::class,
App\Providers\FoundationServiceProvider::class,

app/providers/FoundationServiceProvider.php

namespace App\Providers;

use Illuminate\Foundation\Providers\FoundationServiceProvider as LaravelFoundationServiceProvider;

class FoundationServiceProvider extends LaravelFoundationServiceProvider
{
    /**
     * The provider class names.
     *
     * @var array
     */
    protected $providers = [
        // FormRequestServiceProvider::class,
    ];
}
4年前 评论

方案二,不对呢, 会报 Call to a member function call() on null

4年前 评论

我重新clone了dinggo/api 封装了一个包放到github上了,也同步到composer中了,去掉了,已经解决了,需要的可以clone 我的包 composer require jameskid/dingo-api-fix-twice v1.0.0, github 地址 https://github.com/JamesKid/dingo-api-fix-..., 需要的可以把composer.json里的包改成我这个。

file

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!