* @copyright walkor * @link http://www.workerman.net/ * @license http://www.opensource.org/licenses/mit-license.php MIT License */ namespace support\view; use Twig\Environment; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; use Twig\Error\SyntaxError; use Twig\Loader\FilesystemLoader; use Webman\View; use function app_path; use function array_merge; use function base_path; use function config; use function is_array; use function request; /** * Class Blade * @package support\view */ class Twig implements View { /** * @var array */ protected static $vars = []; /** * Assign. * @param string|array $name * @param mixed $value */ public static function assign($name, $value = null) { static::$vars = array_merge(static::$vars, is_array($name) ? $name : [$name => $value]); } /** * Render. * @param string $template * @param array $vars * @param string|null $app * @param string|null $plugin * @return string */ public static function render(string $template, array $vars, string $app = null, string $plugin = null): string { static $views = []; $request = request(); $plugin = $plugin === null ? ($request->plugin ?? '') : $plugin; $app = $app === null ? $request->app : $app; $configPrefix = $plugin ? "plugin.$plugin." : ''; $viewSuffix = config("{$configPrefix}view.options.view_suffix", 'html'); $key = "$plugin-$app"; if (!isset($views[$key])) { $baseViewPath = $plugin ? base_path() . "/plugin/$plugin/app" : app_path(); $viewPath = $app === '' ? "$baseViewPath/view/" : "$baseViewPath/$app/view/"; $views[$key] = new Environment(new FilesystemLoader($viewPath), config("{$configPrefix}view.options", [])); $extension = config("{$configPrefix}view.extension"); if ($extension) { $extension($views[$key]); } } $vars = array_merge(static::$vars, $vars); $content = $views[$key]->render("$template.$viewSuffix", $vars); static::$vars = []; return $content; } }