ئالدىقى سانلاردا بىز توربەت قېلىپ ئۈچۈن twig
نى ئىشلەتكەن ئىدۇق ئەمدى بىز twig
ئارقىلىق بەتلەرنى چىقىرىپ باقايلى . ئەلۋەتتە بىز WebSerivce
دىن باشلايمىز .
WebSerivce
<?php namespace Impl\Core\Services;
/**
* 网页服务
*/
class WebService{
private $twig = null;
private $route = null;
private $css = [];
private $js = [];
private $html = "";
private $page = "";
/**
* 静态处理器
*/
public static function service(){
$web = new self();
$html = $web->render();
\Response::html($html);
}
/**
* 构造方法
*/
public function __construct(){
$this->registerTwig();
}
/**
* 注册模板
*/
private function registerTwig(){
$loader = new \Twig_Loader_Filesystem([base_dir("app")]);
if(env("debug")){
$twig = new \Twig_Environment($loader);
}else{
$twig = new \Twig_Environment($loader,['cache' => base_dir("cache")]);
}
$ext = new \Impl\Core\Template\ImplTwigExtension;
$ext->webService = $this;
$twig->addExtension($ext);
$this->twig = $twig;
}
/**
* 渲染
*/
public function render(){
//获取当前路由配置
$uri = trim(strtok($_SERVER['REQUEST_URI'],"?"),"/");
$routes = cms("routes");
if(!isset($routes[$uri])){
if(!isset($routes["404"])){
return "Page not found";
}
$uri = "404";
}
$this->route = $routes[$uri];
$this->route["uri"] = $uri;
$this->loadPage();
$this->loadLayout();
return $this->html;
}
/**
* 加载页面
*/
private function loadPage(){
//加载页面样式
if(isset($this->route["css"]) && is_array($this->route["css"])){
foreach ($this->route["css"] as $css) {
$css = $this->assetsParse($css,"css");
if(is_file($css)){
$this->css[] = $css;
}
}
}
//加载页面脚本
if(isset($this->route["js"]) && is_array($this->route["js"])){
foreach ($this->route["js"] as $js) {
$js = $this->assetsParse($js,"js");
if(is_file($js)){
$this->js[] = $js;
}
}
}
//如果没有页面配置文件,抛出异常
if(!isset($this->route["page"])){
throw new \Exception("页面未找到,route:".$this->route["uri"], 1);
};
//渲染页面
$page = $this->templateParse($this->route["page"],"pages");
$this->page = $this->twig->render($page,isset($this->route["data"])?$this->route["data"]:[]);
}
/**
* 加载布局
*/
private function loadLayout(){
//如果布局不存在直接返回页面
if(!isset($this->route["layout"])){
$this->html = $page;return;
};
$layout = $this->templateParse($this->route["layout"],"layouts");
//加载布局配置文件,包括样式,中间件以及其他数据
$config_path = str_replace(".html",".yaml",$layout);
try {
$config = \Yaml::parse(file_get_contents(base_dir("app").$config_path));
} catch (\Exception $e) {
throw new \Exception($e->getMessage(),1);
}
//加载布局样式
if(isset($config["css"]) && is_array($config["css"])){
foreach ($config["css"] as $css) {
$css = $this->assetsParse($css,"css");
if(is_file($css)){
array_unshift($this->css,$css);
}
}
}
//加载布局脚本
if(isset($config["js"]) && is_array($config["js"])){
foreach ($config["js"] as $js) {
$js = $this->assetsParse($js,"js");
if(is_file($js)){
array_unshift($this->js,$js);
}
}
}
//渲染布局页面
$this->html = $this->twig->render($layout,isset($config["data"])?$config["data"]:[]);
}
/**
* 返回样式
*/
public function getStyles(){
$hash = md5(implode("",$this->css));
$style = base_dir("assets")."css/".$hash.".css";
if(!env("debug") && is_file($style)){
$html = '<link rel="stylesheet" type="text/css" href="'.url("assets/css/$hash.css").'">'."\n";
}else{
if(!is_dir(base_dir("assets")."css/")){
mkdir(base_dir("assets")."css");
}
$minifier = new \MatthiasMullie\Minify\CSS;
$minifier->add($this->css);
$minifier->minify($style);
$time = filemtime($style);
$html = '<link rel="stylesheet" type="text/css" href="'.url("assets/css/$hash.css?time=$time").'">'."\n";
}
return $html;
}
/**
* 返回脚本
*/
public function getScripts(){
$hash = md5(implode("",$this->js));
$script = base_dir("assets")."js/".$hash.".js";
if(!env("debug") && is_file($script)){
$html = '<script src="'.url("assets/js/$hash.js").'"></script>'."\n";
}else{
if(!is_dir(base_dir("assets")."js/")){
mkdir(base_dir("assets")."js");
}
$minifier = new \MatthiasMullie\Minify\JS;
$minifier->add($this->js);
$minifier->minify($script);
$time = filemtime($script);
$html = '<script src="'.url("assets/js/$hash.js?time=$time").'"></script>'."\n";
}
return $html;
}
/**
* 返回页面HTML
*/
public function getPage(){
return $this->page;
}
/**
* 生成模板路径
*/
private function templateParse($name,$type){
$file = "";
$appSection = explode("@",$name);
if(count($appSection)>1){
$name = $appSection[1];
$app = $appSection[0];
}else{
$app = $this["route"]["app"];
}
$fileSection = explode(".",$name);
$file = base_dir("app").$app."/src/".$type."/".implode("/",$fileSection).".html";
if(file_exists($file)){
return str_replace(base_dir("app"), "", $file);
}else{
return false;
}
}
/**
* 生成资源路径
*/
private function assetsParse($name,$type){
$name = str_replace(".".$type,"",$name);
$appSection = explode("@", $name);
if(count($appSection) == 1){
$app = $this->route["app"];
}else{
$app = $appSection[0];
$name = $appSection[1];
}
return base_dir("app").$app."/src/assets/".$name.".".$type;
}
}
بىزنىڭ ئاساسلىق كوگىمىز بولسا route
سەپلىمىسى ئارقىلىق قايسى قېلىپنى رېندىرلاشنى بىكىتىمىز . قېلىپ ئىككىگە بۈلىنىدۇ بەت ۋە قۇرۇلما . ئاۋال بەتنى رېندىرلايمىز ، ئەلۋەتتە css js
ھۆججەتلرىنىمۇ ساقلاپ قويۇپ تۇرىمىز . ئاندىن قۇرۇلمىنى رېندىرلايمىز ، قۇرۇلمىنى رېندىرلىغاندا بەتنى بەتنىڭ ئورنىغا قويىمىز ، css js
لەرنىڭ ھەممىنى يىغىپ كىچىكلىتىپ قۇرۇلمىغا قاتىمىز . ئەڭ ئاخرىدا قۇرۇلمىنڭ html
سىنى بەت يۈزىگە قايتۇرۇپ بىرىمىز .
بۇ ئىشلارنى ئورۇنلاش ئۈچۈن بىز ئۆزىمىزگە ماس ھالدا twig
نىڭ قىستۇرمىسىنى يېزىپ چىقىمىز . twig
كېڭەيتىش رامكىنىڭ ئاساسلىق مەقسىدى بولمىغاچقا دوسىلارنىڭ ئۆزى ئۈگۈنىشكە قالدۇرۇلدى . twig
نى كېڭەيتىشنى ئۈگىنەي
ئەمىسە كودنى بىر نۇسقا يوللىۋېتەي .
كود ئادرىسى