gpt4 book ai didi

php - Laravel Blade 在幕后是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 04:34:43 26 4
gpt4 key购买 nike

我试图找到解释这一点的地方,但我找不到任何东西。

我真的很喜欢 Blade 的一个特定方面,那就是 php echo 标签 {{ }}。我很好奇我如何去复制这个在后端执行的过程。

我尝试过的想法

我的一个想法基本上是在 laravel 中制作一条路线,如下所示。

处理程序:

Custom::Include('folder/index.custom.php');

index.custom.php:
<custom>paragraph here</custom>

网络浏览器:
<div id="custom">paragraph here</custom>

这个想法是我的处理程序将被放置在索引页面中。当它被调用时它会做 file_get_contents ,解析每一行寻找自定义标签,然后使用 php echo 打印输出。

这确实有效, 然而 ,问题是当我使用 php 时,它无法正常工作,因为它是服务器端并且已经通过了一次。

这种方式在正确的轨道上似乎也太过分了。我在这里添加我的想法只是为了展示我如何尝试复制这个过程。

有没有人对这是如何做到的有一个简单的解释?

最佳答案

您可以与 file_get_contents 一起玩转输出缓冲区和 eval我的虚拟类(class):

<?php

class Something
{

public function getMatches($pattern, $string){
preg_match_all($pattern, $string, $matches);

if(empty($matches[1]))
return [];

return $matches[1];
}

public function include($file){
$contents = file_get_contents( $file);
$contents = $this->execCodes($contents);

echo $contents;
}

public function execCodes($contents){

//match all @php code() @endphp
$matches = $this->getMatches('/\@php(.*?)\@endphp/is', $contents);

if(empty($matches))
return $contents;

$matches = array_unique($matches);

foreach ($matches as $value) {

//trim spaces
$code = trim($value);

$evaluatedCode = $this->getEvaluatedCode( $code ); //get output of evaluated code

$code = $this->escapeRegExMetaChars($code);

$pattern = "/(\@php.*?" . $code . '.*?\@endphp)/is'; //regex pattern for matching @php func() @endphp

$contents = preg_replace($pattern, $evaluatedCode, $contents); //replace all @php func() @endphp with evaluatedCode output

}

return $contents;

}

function escapeRegExMetaChars($string){

$meta_chars = [ '\\', '^', '$', '.', '[', ']', '|', '(', ')', '?', '*', '+', '{', '}', '-', '\'', '/'];

$len = strlen($string);
$new_string = '';

for($x = 0; $x < $len; $x++){

if( in_array($string[$x], $meta_chars) ){
$new_string .= '\\' . $string[$x];
}else{
$new_string .= $string[$x];
}

}

return $new_string;

}

public function getEvaluatedCode(string $code){

if(preg_match('/^(die|exit)/i', $code)){
return "$code not allowed here";
}

//disable output buffers then return the ouput of the eval'ed code
ob_start();
eval($code);
$output = ob_get_contents();
ob_end_clean();

return $output;

}


}

?>
test.html就好像
<div>
@php
echo "Something";
@endphp
</div>
<strong>
This is a test
</strong>
然后:
$some = new Something();
$some->include('test.html');
输出应该是这样的:
Something
This is a test
你可以用 @if 做同样的事情 @endif , @foreach @endforeach , {{ }} , 等等
你只需要做更多的编码

关于php - Laravel Blade 在幕后是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44598100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com