나는 50줄의 코드로 나뭇가지를 썼다

3330 단어 symfonyphptwig

구성품



"twig like"템플릿 엔진 페이지를 렌더링해야 할 때마다 이러한 구성 요소가 필요합니다. $page: 렌더링하려는 템플릿의 이름입니다. 템플릿의 $계층 구조: $page 1에서 ... te 루트 템플릿까지. 예, 템플릿 엔진과 같은 나뭇가지에서 템플릿이 다른 템플릿을 확장할 수 있기 때문입니다. $cache: 캐시된 파일을 저장하고 파일을 언제든지 다시 여는 대신 캐시에서 콘텐츠를 유지하는 것이 중요하기 때문입니다. 마지막으로 중요한 $blocks: 각 템플릿이 상위 템플릿의 블록을 덮어쓸 수 있기 때문입니다.

$page = 'page';
$hierarchy = [];
$cache = [];
$blocks = [];


계층



템플릿의 계층 구조를 구축하는 것은 매우 간단합니다. 원하는 페이지를 열고 extends 부분이 있는지 확인하십시오. 템플릿에 부모가 포함되지 않을 때까지 부모 템플릿을 찾습니다.

한편 계층 구조를 구축하고 필요한 모든 템플릿도 저장합니다. 궁극적인 렌더링된 템플릿을 빌드하려면 다음 단계에서 다시 필요합니다. 캐시는 더 나은 성능을 구축하는 데 도움이 될 수 있습니다.

do {
    $hierarchy[] = $page;
    $filename = __DIR__ . '/../templates/'.$page.'.engine';
    $cache[$page] = file_get_contents($filename);
    $re = '/extends \'([\w]{0,})\'/m';
    preg_match_all($re, $cache[$page], $matches, PREG_SET_ORDER, 0);
    if ($matches != []) {
        $page = $matches[0][1];
    }
} while ($matches != []);


블록



이제 템플릿의 계층 구조가 있습니다. 루트 템플릿에서 시작하도록 템플릿의 $hierarchy를 뒤집습니다. 여기에서 원하는 템플릿으로 돌아가서 일부 블록을 다시 작성해야 하는지 확인할 수 있습니다.

foreach(array_reverse($hierarchy) as $template) {
    $re = '/ block ([\w<>\/ \n\s]{0,}) /m';
    $content = $cache[$template];
    preg_match_all($re, $content, $matches, PREG_SET_ORDER, 0);
    $blockList = array_column($matches, 1);
    foreach ($blockList as $block) {
        $re = '/{% block '.$block.' %}([\{\}\[\]\w=\"\<\/\> \n\.]{0,}){% endblock '.$block.' %}/m';
        preg_match_all($re, $content, $matches, PREG_SET_ORDER, 0);
        if ($matches != []) {
            $blocks[$block] = $matches[0][1];
        }
    }
}


이제 블록 배열이 생겼습니다. 각 블록에는 각 블록의 최종 버전이 포함되어 있습니다.

렌더링 블록



이제 캐시의 마지막 항목 내용을 가져옵니다. 기억하다? 루트 템플릿입니다. 이제 ... "ultimate"블록 배열을 사용하여 모든 블록을 렌더링하겠습니다.

$content = end($cache);
foreach($blocks as $name => $block) {
    $re = '/{% block '.$name.' %}([\{\}\[\]\w=\"\<\/\> \n\.]{0,}){% endblock '.$name.' %}/m';
    $content = preg_replace($re, $blocks[$name], $content);
}


변수



마지막으로 구현된 기능은 모델의 렌더링입니다. twig에서와 같이 ...{{foo}}는 foo 변수를 렌더링합니다.

$model = [ 'title' => 'titolo dal modello', ];

$re = '/{{([\w]{0,})}}/m';
preg_match_all($re, $content, $matches, PREG_SET_ORDER, 0);
foreach(array_unique(array_column($matches, 1)) as $var) {
    $content = str_replace('{{'.$var.'}}', $model[$var], $content);
}


렌더링, ...



이제$content 렌더링된 템플릿이 포함됩니다. 그냥 인쇄

echo $content;


결론



좋아, 이것은 테스트되지 않은 코드입니다. regexp를 가지고 놀면서 이와 같은 템플릿 엔진을 만들 수 있는지 확인하기 위해 만든 연습일 뿐입니다. 나는 그것을 생산에 사용하지 않을 것이라고 확신합니다. 그냥 연습입니다.

링크



내가 만든 비디오에 대한 링크는 여기에 있습니다: . 이 비디오는 이탈리아어로 말하지만 코드는 php입니다.

좋은 웹페이지 즐겨찾기