overtrue / socialite

Socialite is an OAuth2 Authentication tool. It is inspired by laravel/socialite, you can easily use it without Laravel.
MIT License
1.3k stars 241 forks source link

建议使用`$.autoload.files`定义来优化命名空间常量的自动加载 #252

Closed TheNorthMemory closed 1 year ago

TheNorthMemory commented 1 year ago

注意到,在 f76a57d15562bcb9dbfa08f16ecccb987b2f65a9 及 81a8ef6e2aae3d59f930bc4a658b3062a8e76071 都有类似代码去做接口类强制加载,以支持把分散的命名空间常量加载到,感觉这么做代码就是cv,不够优雅...

翻阅 The composer.json schema

If you want to require certain files explicitly on every request then you can use the files autoloading mechanism. This is useful if your package includes PHP functions that cannot be autoloaded by PHP.

从这个功能上看,PHP的函数(命名空间)常量具有相似的唯一性,仅且只需加载一次,到处可用,建议使用 $.autoload.files 来解决使用 class_exists 强制加载机制。

补丁方案如下:

diff --git a/composer.json b/composer.json
index c690160..a5034a9 100644
--- a/composer.json
+++ b/composer.json
@@ -12,6 +12,7 @@
     "qcloud"
   ],
   "autoload": {
+    "files": ["src/Contracts/FactoryInterface.php", "src/Contracts/ProviderInterface.php", "src/Contracts/UserInterface.php"],
     "psr-4": {
       "Overtrue\\Socialite\\": "src/"
     }
diff --git a/src/Providers/Base.php b/src/Providers/Base.php
index 21e4c85..4bb93e1 100644
--- a/src/Providers/Base.php
+++ b/src/Providers/Base.php
@@ -11,9 +11,6 @@ use Overtrue\Socialite\Exceptions;
 use Psr\Http\Message\MessageInterface;
 use Psr\Http\Message\StreamInterface;

-class_exists(Contracts\FactoryInterface::class);
-class_exists(Contracts\UserInterface::class);
-
 abstract class Base implements Contracts\ProviderInterface
 {
     public const NAME = null;
diff --git a/src/User.php b/src/User.php
index 1154882..eca3554 100644
--- a/src/User.php
+++ b/src/User.php
@@ -5,9 +5,6 @@ namespace Overtrue\Socialite;
 use ArrayAccess;
 use JsonSerializable;

-class_exists(Contracts\FactoryInterface::class);
-class_exists(Contracts\UserInterface::class);
-
 class User implements ArrayAccess, Contracts\UserInterface, JsonSerializable
 {
     use Traits\HasAttributes;

测试:

//file: test.php
<?php

require_once 'vendor/autoload.php';

print_r(preg_grep('/^Overtrue/', array_keys(get_defined_constants())));

可以看到,常量均已被自动加载,无需在实现类中再去强制加载。

Array
(
    [2871] => Overtrue\Socialite\Contracts\ABNF_APP_ID
    [2872] => Overtrue\Socialite\Contracts\ABNF_APP_SECRET
    [2873] => Overtrue\Socialite\Contracts\ABNF_OPEN_ID
    [2874] => Overtrue\Socialite\Contracts\ABNF_TOKEN
    [2875] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CLIENT_ID
    [2876] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CLIENT_SECRET
    [2877] => Overtrue\Socialite\Contracts\RFC6749_ABNF_RESPONSE_TYPE
    [2878] => Overtrue\Socialite\Contracts\RFC6749_ABNF_SCOPE
    [2879] => Overtrue\Socialite\Contracts\RFC6749_ABNF_STATE
    [2880] => Overtrue\Socialite\Contracts\RFC6749_ABNF_REDIRECT_URI
    [2881] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ERROR
    [2882] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ERROR_DESCRIPTION
    [2883] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ERROR_URI
    [2884] => Overtrue\Socialite\Contracts\RFC6749_ABNF_GRANT_TYPE
    [2885] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CODE
    [2886] => Overtrue\Socialite\Contracts\RFC6749_ABNF_ACCESS_TOKEN
    [2887] => Overtrue\Socialite\Contracts\RFC6749_ABNF_TOKEN_TYPE
    [2888] => Overtrue\Socialite\Contracts\RFC6749_ABNF_EXPIRES_IN
    [2889] => Overtrue\Socialite\Contracts\RFC6749_ABNF_USERNAME
    [2890] => Overtrue\Socialite\Contracts\RFC6749_ABNF_PASSWORD
    [2891] => Overtrue\Socialite\Contracts\RFC6749_ABNF_REFRESH_TOKEN
    [2892] => Overtrue\Socialite\Contracts\RFC6749_ABNF_AUTHORATION_CODE
    [2893] => Overtrue\Socialite\Contracts\RFC6749_ABNF_CLIENT_CREDENTIALS
    [2894] => Overtrue\Socialite\Contracts\ABNF_ID
    [2895] => Overtrue\Socialite\Contracts\ABNF_NAME
    [2896] => Overtrue\Socialite\Contracts\ABNF_NICKNAME
    [2897] => Overtrue\Socialite\Contracts\ABNF_EMAIL
    [2898] => Overtrue\Socialite\Contracts\ABNF_AVATAR
)
overtrue commented 1 year ago

:+1: