国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

關(guān)于webman1.5中使用request依賴注入問(wèn)題

chineyoung

問(wèn)題描述

這里詳細(xì)描述問(wèn)題
我在使用依賴注入的過(guò)程發(fā)現(xiàn),我如果在構(gòu)造方法中注入了request,會(huì)導(dǎo)致在使用的時(shí)候一些方法調(diào)用會(huì)有問(wèn)題,比如getRemoteIp()、getRealIp()之類的

程序代碼

// 注釋的方式如下,
// 已經(jīng)在dependence.php添加了\support\Request::class => function () {return request();}
use support\Request;
class RequestService
{
    public function __construct(public Request $req){}
    // 第一次通過(guò)接口調(diào)用這個(gè)方法的話,有值,但是如果通過(guò)接口調(diào)用的話,會(huì)報(bào)錯(cuò)
    public function test(){
        return dd($this->req->getRemoteIp());
    }
}

測(cè)試追加


// 其中進(jìn)程數(shù)設(shè)置為1,控制器復(fù)用也默認(rèn)關(guān)閉,接口請(qǐng)求為post,測(cè)試發(fā)現(xiàn)第一次會(huì)返回正常的ip,當(dāng)再次調(diào)用則依舊顯示報(bào)錯(cuò)

// 控制器
namespace app\controller;

use support\Request;

class IndexController
{

    public function __construct(public Request $req){}
    public function index(Request $request)
    {
        return json($this->req->getRemoteIp());
    }
}

// container.php

$builder = new \DI\ContainerBuilder();
$builder->addDefinitions(config('dependence', []));
$builder->useAutowiring(true);
$builder->useAnnotations(true);
return $builder->build();

// dependence.php
return [
    \support\Request::class => function () {
        return \request();
    },
];

報(bào)錯(cuò)信息

Error: Call to a member function getRemoteIp() on null in /work/codingItems/webman-api/vendor/workerman/webman-framework/src/Http/Request.php:178
Stack trace:
#0 /work/codingItems/webman-api/vendor/workerman/webman-framework/src/Http/Request.php(215): Webman\Http\Request->getRemoteIp()
#1 /work/codingItems/webman-api/app/common/api/request/RequestService.php(35): Webman\Http\Request->getRealIp()
#2 /work/codingItems/webman-api/app/admin/controller/PersonalController.php(18): app\common\api\request\RequestService->checkGetKeys()
#3 /work/codingItems/webman-api/vendor/workerman/webman-framework/src/App.php(325): app\admin\controller\PersonalController->login()
#4 /work/codingItems/webman-api/vendor/workerman/webman-framework/src/App.php(141): Webman\App::Webman\{closure}()
#5 /work/codingItems/webman-api/vendor/workerman/workerman/Connection/TcpConnection.php(646): Webman\App->onMessage()
#6 /work/codingItems/webman-api/vendor/workerman/workerman/Events/Select.php(311): Workerman\Connection\TcpConnection->baseRead()
#7 /work/codingItems/webman-api/vendor/workerman/workerman/Worker.php(1635): Workerman\Events\Select->loop()
#8 /work/codingItems/webman-api/vendor/workerman/workerman/Worker.php(1426): Workerman\Worker::forkOneWorkerForLinux()
#9 /work/codingItems/webman-api/vendor/workerman/workerman/Worker.php(1400): Workerman\Worker::forkWorkersForLinux()
#10 /work/codingItems/webman-api/vendor/workerman/workerman/Worker.php(560): Workerman\Worker::forkWorkers()
#11 /work/codingItems/webman-api/vendor/workerman/webman-framework/src/support/App.php(131): Workerman\Worker::runAll()
#12 /work/codingItems/webman-api/start.php(4): support\App::run()
#13 {main} [] []

截圖報(bào)錯(cuò)信息里報(bào)錯(cuò)文件相關(guān)代碼

首次調(diào)用
再次調(diào)用

操作系統(tǒng)及workerman/webman等框架組件具體版本

workerman/webman-framework:v1.5.11

初始化webman項(xiàng)目的環(huán)境為

系統(tǒng)環(huán)境為wsl2中的Ubuntu20.04
php版本為8.1.7

1489 1 0
1個(gè)回答

walkor 打賞

你的RequestService是怎么初始化的

  • chineyoung 2023-11-22

    通過(guò)接口,首先是去注冊(cè)了\app\common\api\interfaces\RequestInterface::class => function (ContainerInterface $c) {
    return $c->make(\app\common\api\request\RequestService::class);
    },然后編寫class RequestService implements RequestInterface,其中RequestService中就只和上面寫的一樣,只有public function __construct(public Request $req){}這一個(gè)地方初始化,最后控制器里面public function __construct(public RequestInterface $req),利用$this->req->test()

  • chineyoung 2023-11-22

    php用的是8.1,以及我發(fā)現(xiàn)如果把RequestService中的public function __construct(public Request $req){}刪除,然后服務(wù)內(nèi)的之前的依賴注入的req參數(shù)用幫助函數(shù)request(),倒是不會(huì)出現(xiàn)這個(gè)問(wèn)題

  • walkor 2023-11-22

    看現(xiàn)象是RequestService示例持久化到內(nèi)存了,你每次使用的都是第一次實(shí)例化的RequestService。里面的request對(duì)象是過(guò)期的,連接已經(jīng)斷開,connection為null,無(wú)法獲取getRemoteIp

  • chineyoung 2023-11-22

    大大,針對(duì)于這種情況有什么解決方案嘛?還是說(shuō)就老老實(shí)實(shí)用幫助方法就好了,不去對(duì)于Request做非控制器外的注入

  • walkor 2023-11-22

    需要看下是不是復(fù)用了RequestService實(shí)例。進(jìn)程數(shù)設(shè)置為1,然后RequestService的構(gòu)造函數(shù)里輸出日志。
    看下是否是每次請(qǐng)求都初始化新的RequestService實(shí)例。
    如果RequestService實(shí)例被復(fù)用了,需要看下哪里緩存了RequestService實(shí)例,比如是否開了resue_controller復(fù)用控制器導(dǎo)致。

  • chineyoung 2023-11-23

    我重新初始化創(chuàng)建了一個(gè)webman項(xiàng)目,然后通過(guò)直接在初始化的IndexController示例中通過(guò)public function __construct(public Request $req){}進(jìn)行依賴注入,以及在public function index(){return json($this->req->getRemoteIp());}調(diào)用,發(fā)現(xiàn)還是會(huì)存在第一次有值,再次調(diào)用的話就報(bào)錯(cuò)Call to a member function getRemoteIp() on null。但是這種情況好像只存在于post請(qǐng)求,get請(qǐng)求是正常的。其中控制器復(fù)用是默認(rèn)關(guān)閉的,進(jìn)程數(shù)我也設(shè)置為'count' => 1了

  • walkor 2023-11-23

    項(xiàng)目打包發(fā)到 walkor@workerman.net 我看下

  • chineyoung 2023-11-23

    大大,發(fā)送過(guò)去了~

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??