We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
/** * @Reference(pool="user.pool",version="1.0") * * @var TestInterface */ private $testService; /** * @Reference(pool="user.pool",version="2.0") * @var TestInterface */ private $testServiceV2;
通过上述方式分别注入TestInterface的1.0版本和2.0版本。实际调用的时候,1.0会被2.0覆盖掉, 我看了一下源码发现: 在swoft/rpc-client组件: Swoft\Rpc\Client\Proxy.php类newClassName()方法有一行:
TestInterface
swoft/rpc-client
Swoft\Rpc\Client\Proxy.php
newClassName()
return BaseProxy::newClassName($className, $visitor);
它调用了组件swoft/proxy中Swoft\Proxy\Proxy.php的newClassName()方法 而有newClassName()方法中又有
swoft/proxy
Swoft\Proxy\Proxy.php
if (isset(self::$caches[$className])) { return self::$caches[$className]; }
传入类名相同时,如果存在已有代理类则不生成直接返回原有代理类。
上述代码中的$className都是要生成代理类的类名,也就是TestInterface, 所以,实际上生成1.0和2.0两个版本的TestInterface代理类时,由于两次调用BaseProxy::newClassName($className, $visitor);传递的类名是一样的,导致两个不同版本的代理类实际上只有第一次成功创建了代理类,第二次创建返回的是cache中历史数据。
$className
BaseProxy::newClassName($className, $visitor);
考虑的修复方法是,调用创建代理类的方法时把版本带上,然后将代理类保存在cache的时候,健名也带上版本号。需要修改swoft/rpc-client和swoft/proxy两个组件
The text was updated successfully, but these errors were encountered:
swoft-cloud/swoft-component@603fee6
fix: swoft-cloud/swoft/issues/1297 rpc client version invalid error
113764a
8b491b1
c38faa5
stelin
No branches or pull requests
通过上述方式分别注入
TestInterface
的1.0版本和2.0版本。实际调用的时候,1.0会被2.0覆盖掉,我看了一下源码发现:
在
swoft/rpc-client
组件:Swoft\Rpc\Client\Proxy.php
类newClassName()
方法有一行:它调用了组件
swoft/proxy
中Swoft\Proxy\Proxy.php
的newClassName()
方法而有
newClassName()
方法中又有传入类名相同时,如果存在已有代理类则不生成直接返回原有代理类。
上述代码中的
$className
都是要生成代理类的类名,也就是TestInterface
,所以,实际上生成1.0和2.0两个版本的
TestInterface
代理类时,由于两次调用BaseProxy::newClassName($className, $visitor);
传递的类名是一样的,导致两个不同版本的代理类实际上只有第一次成功创建了代理类,第二次创建返回的是cache中历史数据。考虑的修复方法是,调用创建代理类的方法时把版本带上,然后将代理类保存在cache的时候,健名也带上版本号。需要修改
swoft/rpc-client
和swoft/proxy
两个组件The text was updated successfully, but these errors were encountered: