jakewhiteley/bladezero

9.52.16 2024-04-11 19:51 UTC

This package is auto-updated.

Last update: 2024-09-11 20:37:06 UTC


README

以正确的方式将 Laravel 的 Blade 模板引擎导入到非 Laravel 应用程序中。

错误的方式

所有其他独立的 blade 版本都需要 ~16 个依赖项,并在您的应用程序中运行 Iluminate/ContainerIlluminate/View 包。这会给您的应用程序添加很多复杂性,并且被认为是一个坏主意

有几个包从头开始重新编写整个 Blade 引擎的实例,这会产生以下典型问题

  • 不再能够依赖Laravel 文档,意味着文档通常是错误的。
  • 功能常常缺失或实现不正确。

正确的方式

BladeZero 直接从 laravel/framework 分离出来,只包含编译 Blade 模板所需的文件 - 没有容器,没有视图,没有麻烦。

95% 的代码与 Taylor Otwell 和 Laravel 贡献者编写的代码完全匹配,这意味着每个 Blade 功能都按照应有的方式完全支持。

安装

使用 Composer

composer require jakewhiteley/bladezero

使用方法

拉取包后,您需要提供模板和缓存目录的完整路径

use Bladezero\Factory;

$templatesPath = realpath('./files');
$cachePath = realpath('./cache');

$blade = new Factory($templatesPath, $cachePath);

// Make and output a view with some data
echo $blade->make('example', ['title' => 'It Works!']);

扩展 BladeZero

由于 BladeZero\Factory 类只是一个修改过的 Illuminate\View\Factory,因此您会期望所有这些方法都是可用的

// Add a new templates directory
$blade->addLocation(realpath('./shared/components'));

// Add a namespace
$blade->addNamespace('shared', realpath('./shared/components'));

// Register a component
$blade->component('components.alert', 'alert');

// Register a custom directive
$blade->directive('foo', function($expression) {
    return "<?php echo 'foo' . $expression; ?>";
});

// Register a custom if directive
$blade->if('foo', function($bar) {
    return $bar === 'foobar';
});

// Register a custom template alias
$blade->include('php.raw', 'foo');

// Add shared data
$blade->share($key, $value = null);

BladeZero 支持您所知道的全部 Blade 功能,例如 自定义指令自定义 if 语句组件

BladeZero 允许您编写自己的 View 类,因为这个包是为您自己的项目提供 Blade 渲染引擎而设计的 - 而不是包含 Laravel 的一半功能。为了方便起见,您可以通过 View 面具访问的一些功能也可用;例如 将数据提供给所有视图,以及视图命名空间

差异

尽管 Blade 编译器与 Laravel 中的孪生版本完全相同,但 您的应用程序不是

因此,BladeZero 提供了方法,以便在您的框架中轻松使用 Blade 的 Laravel 特定功能

@csrf

使用 setCsrfHandler 方法指定如何提供带有正确令牌的 @csrf() 指令

$blade->setCsrfHandler(function(): string {
    return MySessionClass::getUserToken();
});

@auth

设置您的应用程序如何处理 auth 指令,如 @auth@elseauth@guest

$blade->setAuthHandler(function(string $guard = null): bool {
    return MyUserClass::currentUserIs($guard);
});

@can

设置您的应用程序如何处理权限指令,如 @can@cannot@canany

$blade->setcanHandler(function($abilities, $arguments = []): bool {
    return MyUserClass::currentUserCan($abilities, $arguments);
});

@inject

如果您的应用程序使用 依赖注入容器,则指定通过 @inject 如何解决服务

$blade->setInjectHandler(function(string $service) {
    return MyContainer::resolveService($service);
});

@error

允许您提供 @error 指令应该如何工作。

您的回调应返回第一个错误字符串或 false

$blade->setErrorHandler(function(string $key) {
    return MyErrorBag::getErrorMessageFor($key);
});