当前位置: 首页 > news >正文

南昌市,做网站的公司国外家具设计网站大全

南昌市,做网站的公司,国外家具设计网站大全,国内做文玩的网站,戴尔公司网站建设成功的关键首先,我们通过几个要点来解释 Blade 引擎的工作原理。 您选择一个 Blade 模板进行渲染。引擎使用一系列正则表达式来解析和编译模板。该引擎生成一个普通的 PHP 文件并将其写入磁盘(以便将其缓存以供将来渲染)。包含 PHP 文件并使用输出缓冲…

首先,我们通过几个要点来解释 Blade 引擎的工作原理。

  • 您选择一个 Blade 模板进行渲染。
  • 引擎使用一系列正则表达式来解析和编译模板。
  • 该引擎生成一个普通的 PHP 文件并将其写入磁盘(以便将其缓存以供将来渲染)。
  • 包含 PHP 文件并使用输出缓冲区来捕获生成的 HTML。

该过程中最有趣的步骤是使用 RegEx 模式从模板中提取各种内容并生成适当的 PHP 代码。其他模板引擎使用更传统的标记器和解析器来处理模板,但由于 Blade 或多或少只是常规 PHP 代码的语法糖,因此它可以以更简单的方式完成工作。

这意味着您基本上总是在处理可能包含普通 PHP 代码的任意字符串。

您可以编写自己的 Blade 指令。这样您就可以在指令中隐藏大量样板代码并简化 Blade 模板。

Blade::directive('example', function (string $expression) {// Logic goes here.
});

让很多新的 Laravel 开发人员感到困惑的是,自定义指令仅接收回调函数的一个参数。

假设@example()此处的指令设计为接受 2 个参数:

@example('Hello, ', 'Ryan')

经验较少的 Laravel 开发人员可能希望回调函数接收两个参数,对应于我们传递给实际指令的两个参数。

但事实并非如此。相反,我们从 Blade 模板收到一个包含文字的字符串。

Blade::directive('example', function (string $expression) {assert($expression === "'Hello, ', 'Ryan'");
});

因此,我们实际上不想在回调中编写常规 PHP 代码并返回值,而是想返回一串 PHP 代码。然后,该 PHP 代码将插入到生成的模板中以代替原始指令。

Blade::directive("example", function (string $expression) {return "<?php echo implode(' ', [{$expression}]); ?>";
});

一些软件包可以扩展 Laravel 以支持更合乎逻辑的“在回调中接收真实参数”方法,但事实上我们这里有一个字符串意味着我们可以做一些有趣和有创意的事情。

自定义 Blade 指令通常会为常规 PHP 函数提供包装器。PHP 8.0 引入了“命名参数”的概念,允许您无序地将参数传递给函数,而是提供参数的名称。

function hello(string $name, string $greeting = "Hello, ")
{return $greeting . $name;
}hello(greeting: "Greetings, ", name: "Ryan");

如果我们将这个hello()函数包装在 Blade 指令中,我们实际上仍然可以使用命名参数!

Blade::directive("hello", function (string $expression) {return "<?php echo hello({$expression}); ?>";
});
@hello(greeting: "Greetings,", name: "Ryan")

由于括号之间的文本只是插入到我们的表达式中,因此命名参数会逐字传递给底层hello()函数。

很酷!

大多数 Laravel 开发人员可能都曾在他们的项目中使用过“魔法变量”。最常见的两个例子可能是块$loop内可用的变量@foreach和块$message内的变量@error

Laravel 附带一个@auth指令,允许您根据用户是否登录有条件地执行操作。这很酷,但我想发送自己的@auth指令,将当前用户作为变量注入到代码块中$user

有趣的是,您实际上可以用自定义指令覆盖 Laravel 自己的指令,因为 Blade 编译器会先检查自定义指令。但我不建议这样做,所有这些代码纯粹是为了教育和演示目的!

Blade::directive("auth", function (string $expression) {$guard = $expression ?: "()";return "<?php if (auth()->guard{$guard}->check()): ?>" .'<?php $user = auth()->user(); ?>';
});Blade::directive("endauth", function () {return '<?php unset($user); ?>' . "<?php endif; ?>";
});

上面的代码为每个指令返回多个语句。启动和结束块if,以及创建和取消设置魔法$user变量。

该代码并非 100% 可靠,请不要在您自己的应用程序中这样做。

我们可以将指令编译成任意 PHP 代码,这为很多事情带来了一些很酷的机会。我甚至开发了几个利用这一点的软件包来缓存 Blade 代码块,甚至创建内联部分代码!

  • blade 缓存指令
  • blade 捕获指令

我们可以利用 Blade 指令的字符串特性的另一种方法是在 Blade 指令内编写我们自己的特定领域语言。

很多服务器端模板引擎都有“过滤器”的概念。下面是 Twig 的一个示例:

{{ names | join(',') | lower }}

names传递给函数的变量join()。然后的输出join(',')被发送到lower,然后该操作的结果被输出到模板中。

如果我们想在 Blade 指令中执行相同操作,也许是这样的:

@filter($names | join(',') | lower)

第一步是解析指令内部的内容。为了获取所有不同的过滤器和变量,我们可以按标记拆分表达式|,删除每个部分周围的多余空格。

$parts = array_map(trim(...), explode("|", $expression));

为了简单起见,我们假设第一部分始终是一个有效的 PHP 表达式。

$subject = $parts[0];
$filters = array_slice($parts, 1);

每个过滤器都将映射到一个Closure,它接受当前的值$subject以及我们传递给过滤器的任何参数。我们需要一个地方来存储这些回调函数。

警告:您将要看到的代码包含魔法。

class Filters
{protected array $filters = [];public function __construct(protected mixed $subject){$this->addFilter("join", function (array $subject, string $glue = "") {return implode($glue, $subject);});$this->addFilter("lower", function (string $subject) {return strtolower($subject);});}public function addFilter(string $name, Closure $callback): void{$this->filters[$name] = $callback;}public function get(): mixed{return $this->subject;}public function __call(string $name, array $args){if (!isset($this->filters[$name])) {throw new Exception("Unrecognised filter [{$name}].");}$this->subject = $this->filters[$name]($this->subject, ...$args);return $this;}public function __get(string $name){return $this->{$name}();}
}

每个过滤器在实例化时都会向类注册。要实际调用过滤器,您可以调用类中不存在的方法或访问不存在的属性。

然后,Blade 指令需要将过滤器字符串转换为对象的一系列方法调用Filters

return sprintf(<<<'PHP'
<?php echo (new \App\Filters(%s))->%s->get(); ?>
PHP,$subject,implode("\n    ->", $filters)
);

$subject传递给构造函数,然后每个过滤器将作为方法或属性链接到对象上。这会触发对象上的__call()或方法,从而运行过滤器。__get()$subject

然后在最后,->get()调用该方法来检索渲染模板中的最终值和输出。

我警告过你,这里有魔法。

因此,上面的 Blade 示例将转换为如下形式:

echo (new \App\Filters($names))->join(',')->lower->get();

通过['Ryan', 'Jane', 'John']这组过滤器将产生ryan,jane,john

这是一些非常奇怪和古怪的东西 - 你可能永远不想在实际应用程序中使用它们 - 但无论如何,玩弄它们还是很酷的。

也许您会采纳其中的一些想法并构建一些自己的很酷的 Blade 指令,以达到有趣和神奇的目的。

http://www.yayakq.cn/news/612674/

相关文章:

  • 网站备案用户名忘了怎么办网站建设与管理读书心得
  • 国家和住房城乡建设部网站宁波网络推广优化公司
  • 外贸商城网站制作上海有哪些大公司总部
  • 中山大兴网站建设电子硬件工程师培训机构
  • 深圳专业建网站公司排行wordpress主题使用方法
  • 用c语言可以做网站吗微信上的网站怎么做的吗
  • 杭州网站推广优化esc服务器 wordpress
  • 宁波网络营销有哪些绵阳seo
  • 成品网站w灬源码1688在线视频网站如何制作
  • 帝国网站管理系统教程wordpress支付回调
  • 商务网站推广目标有哪些广东建设厅官网查询平台
  • 番禺网站建设技术游戏建设网站
  • 拼团购物网站开发做网站挂广告
  • wap网站建设兴田德润优惠网站申请备案流程
  • 网站的颜色2021年经典营销案例
  • 网站建设厌倦重庆建设监理协会网站
  • 微信公众号制作方法河南网站关键词优化
  • 建设部网站 造价精品建站
  • 济南网站建设平台官网icp备案是网站上线前
  • 电子商务网站建设期末试题微信公众号怎么创建优惠券
  • rp如何做网站专业做私募网站
  • 15年做哪些网站致富怎样设计自己的网站
  • 免费学校网站模板htmlapp制作免费
  • 丹东建设网官方网站建设工程造价信息网站
  • 塑料公司网站建设方案wordpress中文连接
  • wordpress 插件站做企业网站的前景
  • 商场大型话题活动策划网站平台已经维护6天了
  • 淄博专业网站建设哪家好北京外企人力资源服务有限公司
  • 微擎如何做网站郑州高端网站公司
  • 网站建设后期维护流程网页制作教程软件