{"id":10006307,"date":"2022-08-24T15:53:40","date_gmt":"2022-08-24T07:53:40","guid":{"rendered":"https:\/\/ityet.com\/?p=10006307"},"modified":"2022-08-24T15:53:40","modified_gmt":"2022-08-24T07:53:40","slug":"laravel-%e5%ba%94%e7%94%a8%e4%b8%ad%e5%bf%ab%e9%80%9f%e7%9a%84%e5%88%9b%e5%bb%ba%e4%b8%8d%e5%90%8c%e7%b1%bb%e5%9e%8b%e7%9a%84%e4%bb%a3%e7%90%86","status":"publish","type":"post","link":"https:\/\/itmax.cn\/?p=10006307","title":{"rendered":"Laravel \u5e94\u7528\u4e2d\u5feb\u901f\u7684\u521b\u5efa\u4e0d\u540c\u7c7b\u578b\u7684\u4ee3\u7406"},"content":{"rendered":"<blockquote><p><a href=\"https:\/\/link.segmentfault.com\/?enc=uQ98eCYsd5uaPlZC1xBOBg%3D%3D.g%2B8pEFMdKvu4REKYVyx%2BiFSX2CmaH9o7EPfgFH32HQr2tN1yurQ4MEJBnGlhMHZZC840Y9DaZg5U6iO%2F3oW4VQ%3D%3D\" rel=\"nofollow\">laravel-proxy-manager<\/a> &#8211; \u96c6\u6210 <a href=\"https:\/\/link.segmentfault.com\/?enc=V7RL1rpzGZmM0NAgjmpmeQ%3D%3D.UIFvbUxVAVPI%2FZ7C3P73CiljV7kGyBYtMKdxR483cFA2VQKGP6q3OY4u72IMn1b%2B\" rel=\"nofollow\"><code>Ocramius\/ProxyManager<\/code><\/a> \u5230 Laravel \u5e94\u7528\u3002<\/p><\/blockquote>\n<h2>\u529f\u80fd<\/h2>\n<ul>\n<li>\u5feb\u901f\u521b\u5efa\u4e0d\u540c\u7c7b\u578b\u7684\u4ee3\u7406\u5b9e\u4f8b\u3002<\/li>\n<li>\u5feb\u901f\u7ed1\u5b9a\u4e0d\u540c\u7c7b\u578b\u7684\u4ee3\u7406\u5b9e\u4f8b\u5230\u5bb9\u5668\u3002<\/li>\n<li>\u5feb\u901f\u6269\u5c55\u4e3a\u4e0d\u540c\u7c7b\u578b\u7684\u4ee3\u7406\u5b9e\u4f8b\u5230\u5bb9\u5668\u3002<\/li>\n<\/ul>\n<h2>\u5b89\u88c5<\/h2>\n<pre><code class=\"shell\">$ composer require guanguans\/laravel-proxy-manager -vvv<\/code><\/pre>\n<pre><code class=\"shell\">$ php artisan vendor:publish --provider=&quot;Guanguans\/\/LaravelProxyManager\/\/ProxyManagerServiceProvider&quot;<\/code><\/pre>\n<h2>\u4f7f\u7528<\/h2>\n<h3>\u83b7\u53d6\u4ee3\u7406\u7ba1\u7406\u5668\u5b9e\u4f8b<\/h3>\n<pre><code class=\"php\">app(\/Guanguans\/LaravelProxyManager\/ProxyManager::class);\nresolve(\/Guanguans\/LaravelProxyManager\/ProxyManager::class);<\/code><\/pre>\n<h3>\u4ee3\u7406\u7ba1\u7406\u5668\u95e8\u9762\u65b9\u6cd5<\/h3>\n<pre><code class=\"php\">&lt;?php\n\nnamespace Guanguans\/LaravelProxyManager\/Facades;\n\n\/**\n * \u521b\u5efa\u4ee3\u7406\n * @method static \/ProxyManager\/Proxy\/AccessInterceptorInterface            createAccessInterceptorScopeLocalizerProxy(object $instance, array $prefixInterceptors = [], array $suffixInterceptors = [])\n * @method static \/ProxyManager\/Proxy\/AccessInterceptorValueHolderInterface createAccessInterceptorValueHolderProxy(object $instance, array $prefixInterceptors = [], array $suffixInterceptors = [])\n * @method static \/ProxyManager\/Proxy\/GhostObjectInterface                  createLazyLoadingGhostFactoryProxy(string $className, \/Closure $initializer, array $proxyOptions = [])\n * @method static \/ProxyManager\/Proxy\/VirtualProxyInterface                 createLazyLoadingValueHolderProxy(string $className, \/Closure $initializer, array $proxyOptions = [])\n * @method static \/ProxyManager\/Proxy\/NullObjectInterface                   createNullObjectProxy($instanceOrClassName)\n * @method static \/ProxyManager\/Proxy\/RemoteObjectInterface                 createRemoteObjectProxy($instanceOrClassName, ?\/ProxyManager\/Factory\/RemoteObject\/AdapterInterface $adapter = null)\n *\n * \u7ed1\u5b9a\u4ee3\u7406\n * @method static void                                                      singletonLazyLoadingValueHolderProxy(string $className, ?\/Closure $concrete = null)\n * @method static void                                                      bindLazyLoadingValueHolderProxy(string $className, ?\/Closure $concrete = null, bool $shared = false)\n * @method static void                                                      singletonNullObjectProxy(string $className)\n * @method static void                                                      bindNullObjectProxy(string $className, bool $shared = false)\n * @method static void                                                      singletonRemoteObjectProxy(string $className, ?\/ProxyManager\/Factory\/RemoteObject\/AdapterInterface $adapter = null)\n * @method static void                                                      bindRemoteObjectProxy(string $className, ?\/ProxyManager\/Factory\/RemoteObject\/AdapterInterface $adapter = null, bool $shared = false)\n * \n * \u6269\u5c55\u4e3a\u4ee3\u7406\n * @method static void                                                      extendToAccessInterceptorScopeLocalizerProxy(string $abstract, array $prefixInterceptors = [], array $suffixInterceptors = [])\n * @method static void                                                      extendToAccessInterceptorValueHolderProxy(string $abstract, array $prefixInterceptors = [], array $suffixInterceptors = [])\n * @method static void                                                      extendToLazyLoadingGhostFactoryProxy(string $abstract, \/Closure $initializer, array $proxyOptions = [])\n * @method static void                                                      extendToLazyLoadingValueHolderProxy(string $abstract, \/Closure $initializer, array $proxyOptions = [])\n * @method static void                                                      extendToNullObjectProxy(string $abstract)\n * @method static void                                                      extendToRemoteObjectProxy(string $abstract, ?\/ProxyManager\/Factory\/RemoteObject\/AdapterInterface $adapter = null)\n *\n * @see \/Guanguans\/LaravelProxyManager\/ProxyManager\n *\/\nclass ProxyManager{}<\/code><\/pre>\n<h3>\u7ed1\u5b9a\u865a\u62df\u4ee3\u7406\u793a\u4f8b(\u61d2\u521d\u59cb\u5316)<\/h3>\n<pre><code class=\"php\">&lt;?php\n\nnamespace App;\n\nuse App\/Foo;\nuse Guanguans\/LaravelProxyManager\/Facades\/ProxyManager;\nuse SebastianBergmann\/Timer\/ResourceUsageFormatter;\nuse SebastianBergmann\/Timer\/Timer;\n\nclass Foo\n{\n    \/** @var string *\/\n    private $bar;\n\n    public function __construct(string $bar = 'bar')\n    {\n        $this-&gt;bar = $bar;\n        sleep(3);\n    }\n\n    public function getBar(): string\n    {\n        return $this-&gt;bar;\n    }\n}\n\n\/\/ ProxyManager::bindLazyLoadingValueHolderProxy(Foo::class);\nProxyManager::singletonLazyLoadingValueHolderProxy(Foo::class);\n\n$formatter = new ResourceUsageFormatter();\n$timer = new Timer();\n$timer-&gt;start();\n$timer-&gt;start();\n\n\/\/ \u521d\u59cb\u4ee3\u7406\u7c7b\u65f6\u4e0d\u4f1a\u8c03\u7528\u539f\u7c7b\u7684\u6784\u9020\u51fd\u6570\ndump($foo = app(Foo::class), $formatter-&gt;resourceUsage($timer-&gt;stop()));\n\/\/ \u5f53\u771f\u6b63\u8c03\u7528\u65f6\u624d\u4f1a\u8c03\u7528\u539f\u7c7b\u7684\u6784\u9020\u51fd\u6570\ndump($foo-&gt;getBar(), $formatter-&gt;resourceUsage($timer-&gt;stop()));<\/code><\/pre>\n<pre><code class=\"shell\">ProxyManagerGeneratedProxy\/__PM__\/App\/Foo\/Generated5320f6306ba550844e07c949e4af382d - App\/Foo@proxy {#774\n  -valueHolder1cdad: null\n  -initializer7920c: Closure(?object &amp;$wrappedObject, ?object $proxy, string $method, array $parameters, ?Closure &amp;$initializer) {#758\n    class: &quot;Guanguans\/LaravelProxyManager\/ProxyManager&quot;\n    this: Guanguans\/LaravelProxyManager\/ProxyManager {#755 \u2026}\n    use: {\n      $className: &quot;App\/Foo&quot;\n      $classArgs: []\n    }\n    file: &quot;\/Users\/yaozm\/Documents\/develop\/laravel-proxy-manager\/src\/ProxyManager.php&quot;\n    line: &quot;282 to 287&quot;\n  }\n}\n&quot;Time: 00:00.008, Memory: 20.00 MB&quot;\n&quot;bar&quot;\n&quot;Time: 00:03.025, Memory: 22.00 MB&quot;<\/code><\/pre>\n<h3>\u6269\u5c55\u4e3a\u8bbf\u95ee\u62e6\u622a\u5668\u4ee3\u7406\u793a\u4f8b(\u5207\u9762)<\/h3>\n<pre><code class=\"php\">ProxyManager::extendToAccessInterceptorValueHolderProxy(\n    LogManager::class,\n    [\n        'error' =&gt; static function (\n            object $proxy,\n            LogManager $realInstance,\n            string $method,\n            array $parameters,\n            bool &amp;$returnEarly\n        ){\n            dump('Before executing the error log method.');\n        }\n    ],\n    [\n        'error' =&gt; static function (\n            object $proxy,\n            LogManager $realInstance,\n            string $method,\n            array $parameters,\n            &amp;$returnValue,\n            bool &amp;$overrideReturnValue\n        ){\n            dump('After executing the error log method.');\n        }\n    ]\n);\n\ndump($logger = app(LogManager::class));\n$logger-&gt;error('What happened?');<\/code><\/pre>\n<pre><code class=\"shell\">ProxyManagerGeneratedProxy\/__PM__\/Illuminate\/Log\/LogManager\/Generated9b66c8f3bc457c2c26acc55874d391b3 - Illuminate\/Log\/LogManager@proxy {#298 \u25bc\n  -valueHolder8f21a: Illuminate\/Log\/LogManager {#168 \u25bc\n    #app: Illuminate\/Foundation\/Application {#6 \u25b6}\n    #channels: []\n    #customCreators: array:1 [\u25b6]\n    #dateFormat: &quot;Y-m-d H:i:s&quot;\n    #levels: array:8 [\u25b6]\n  }\n  -methodPrefixInterceptors8d709: array:1 [\u25bc\n    &quot;error&quot; =&gt; Closure(object $proxy, LogManager $realInstance, string $method, array $parameters, bool &amp;$returnEarly) {#280 \u25b6}\n  ]\n  -methodSuffixInterceptors2a12b: array:1 [\u25bc\n    &quot;error&quot; =&gt; Closure(object $proxy, LogManager $realInstance, string $method, array $parameters, &amp;$returnValue, bool &amp;$overrideReturnValue) {#278 \u25b6}\n  ]\n}\n&quot;Before executing the error log method.&quot;\n&quot;After executing the error log method.&quot;<\/code><\/pre>\n<h3>\u547d\u4ee4<\/h3>\n<pre><code class=\"shell\">$ php artisan proxy:list\n$ php artisan proxy:clear<\/code><\/pre>\n<pre><code class=\"shell\">\u2570\u2500 php artisan proxy:list                                                                                       \u2500\u256f\n+-------+---------------------------+-------------------------------------------+---------------------------------+\n| Index | Original Class            | Proxy Class                               | Proxy Type                      |\n+-------+---------------------------+-------------------------------------------+---------------------------------+\n| 1     | App\/Foo                   | Generated5320f6306ba550844e07c949e4af382d | Virtual Proxy                   |\n| 2     | Illuminate\/Log\/LogManager | Generated9b66c8f3bc457c2c26acc55874d391b3 | Access Interceptor Value Holder |\n+-------+---------------------------+-------------------------------------------+---------------------------------+<\/code><\/pre>\n<h2>\u53c2\u8003\u94fe\u63a5<\/h2>\n<ul>\n<li><a href=\"https:\/\/link.segmentfault.com\/?enc=ZNEyBnICGxnQkEtFlPUFIg%3D%3D.vbk7%2Fh1omy6n0qABvZUC2FNZsKdeMiBh08074lhrI%2FFbyzk%2FxoPQPdoF3OFK0qyQ\" rel=\"nofollow\">https:\/\/github.com\/Ocramius\/ProxyManager<\/a><\/li>\n<li><a href=\"https:\/\/link.segmentfault.com\/?enc=FomNQsI0xbPb1aGFk4%2F68A%3D%3D.1X0Dqs7eHAwJ0bqnazFHI%2Be7vIML%2BhUalc8mcrIfpVjzLl0bLktONzsgoQZqdGhVvIt5rd5b2YLUJv1m9ftFcZRjnNp%2BRE38Ss%2BaUZ%2F2k34%3D\" rel=\"nofollow\">https:\/\/www.sitepoint.com\/restful-remote-object-proxies-with-proxymanager\/<\/a><\/li>\n<\/ul>\n<h2>\u539f\u6587\u94fe\u63a5<\/h2>\n<ul>\n<li><a href=\"https:\/\/link.segmentfault.com\/?enc=X%2FBEZ0usenQ9XQl1B%2BojNA%3D%3D.V9yD0nrx7jW8mSjluZ0uomNnK6HE0dBFMI0ck9A88PpSDyHN1ts%2F4DI9OHI3CdAnQss5GznefKy0JJ%2BcEEiviQ%3D%3D\" rel=\"nofollow\">https:\/\/github.com\/guanguans\/guanguans.github.io\/issues\/48<\/a><\/li>\n<\/ul>\n<p><a href=\"https:\/\/segmentfault.com\/a\/1190000042369392\">https:\/\/segmentfault.com\/a\/1190000042369392<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>laravel-proxy-manager &#8211; \u96c6\u6210 Ocramius\/ProxyManager  [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-10006307","post","type-post","status-publish","format-standard","hentry"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10006307"}],"version-history":[{"count":0,"href":"https:\/\/itmax.cn\/index.php?rest_route=\/wp\/v2\/posts\/10006307\/revisions"}],"wp:attachment":[{"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10006307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10006307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itmax.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10006307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}