commands([ HookListeners::class, ]); $this->app->singleton('Hook', function () { return new Hook(); }); } public function boot() { $this->bootHookDirectives(); $this->bootWrapperHookDirectives(); } /** * 添加 blade hook 标签, 不需要 @endhook * @hook('xxx'), 添加 hook 直接输出到页面 */ protected function bootHookDirectives() { Blade::directive('hook', function ($parameter) { $parameter = trim($parameter, '()'); $parameters = explode(',', $parameter); $name = trim($parameters[0], "'"); $definedVars = $this->parseParameters($parameters); return ' $__definedVars],function($data) { return null; }); if ($output) echo $output; ?>'; }); } /** * 添加 blade wrapper hook 标签 * * @hookwrapper('xxx') --- @endhookwrapper, 将某段代码打包输出再添加 hook 输出 */ protected function bootWrapperHookDirectives() { Blade::directive('hookwrapper', function ($parameter) { $parameter = trim($parameter, '()'); $parameters = explode(',', $parameter); $name = trim($parameters[0], "'"); return ' '; }); Blade::directive('endhookwrapper', function () { return ' $__definedVars],function($data) { return null; },$__hook_content); unset($__hook_name); unset($__hook_content); if ($output) echo $output; ?>'; }); } /** * Parse parameters from Blade * * @param $parameters * @return string */ protected function parseParameters($parameters):string { $definedVars = ''; foreach ($parameters as $paraItem) { $paraItem = trim($paraItem); if (Str::startsWith($paraItem,'$')) { $paraKey = trim($paraItem, '$'); $definedVars .= '$__definedVars["'.$paraKey.'"] = $'.$paraKey.';'; } } return $definedVars; } }