There is no problem not worth solving, and no technology not worth learning!

In Laravel 6, run a file that contains PHP Blade syntax and get its output

决定跳过将 PHP Blade 文件编译为 PHP 模板文件的这一步,而是手动调整为编译后的格式,然后去除掉其中的 Blade 语法。以下为编译后的一段 Blade 格式示例

1. There is a php Blade code block, which is placed in mysql, and its code is stored in the field schema, as shown in Figure 1

现有一段 PHP Blade 代码块,放在 MySQL 中,其代码存放在字段 schema 中
Figure 1

2. Some variables, already declared in the php script, the code block is shown below

{
  "sections": {
    @foreach ($homepage as $id => $section)
      {{-- 轮播图 --}}
      @if($section['type'] === 'carousel')
        "{{ $id }}": {
          "type": "carousel",
          "settings": {
            "loop": true,
            "autoplay": true,
            "height": "{{ isset($section['slide_height']) && $section['slide_height'] === 'full' ? 'full' : 'auto' }}",
            "interval": {{ $section['interval'] }}
          },
          "blocks": {
            @if (isset($section['items']))
              @foreach ($section['items'] as $key => $item)
                "slide-{{ $key }}": {
                  "type": "slide",
                  "settings": {
                    "image": "{{ @$item['image']['url'] ?: '' }}",
                    "url": "{{ $item['button']['url'] }}",
                    "align": "{{ $item['align'] }}",
                    "title": {-- $item['title'] --},
                    "description": {-- $item['description'] --},
                    "button": {-- $item['button']['text'] --},
                    "opacity": {{ $item['show_overlay'] ? (100 - $item['opacity']) : 100 }},
                    "button_background_color": "{{ $item['button_background_color'] }}",
                    "button_color": "{{ $item['button_text_color']}}",
                    "color": "{{ $item['text_color'] }}"
                  }
                }@if (!$loop->last),@endif
              @endforeach
            @endif
          }
        },
      @endif
      {{-- 商品分类 --}}
      @if($section['type'] === 'collection')
        "{{ $id }}": {
          "type": "main-collections",
          "settings": {
            "heading": {-- $section['title'] --}
          },
          "blocks": {
            @foreach ($section['ids'] as $key => $item)
              "collection-{{ $key }}": {
                "type": "collection",
                "settings": {
                  "id": {{ $item }}
                }
              }@if (!$loop->last),@endif
            @endforeach
          }
        },
      @endif
      {{-- 精选商品 --}}
      @if($section['type'] === 'product')
        "{{ $id }}": {
          "type": "main-products",
          "settings": {
            "show_product_palette": {{ @Module::find('ProductPalette')->isEnabled() && @config('product-palette.show_position') === 'all' ? 'true' : 'false' }},
            "heading": {-- $section['title'] --},
            "layout": "{{ $section['layout'] }}",
            "page_size": {{ $section['amount'] }}
          },
          "blocks": {
            @foreach ($section['category'] as $key => $item)
              "collection-{{ $key }}": {
                "type": "collection",
                "settings": {
                  "id": {{ $item }}
                }
              }@if (!$loop->last),@endif
            @endforeach
          }
        },
      @endif
      {{-- 邮件订阅 --}}
      @if($section['type'] === 'subscribe')
        "{{ $id }}": {
          "type": "apps",
          "blocks": {
            "newsletter": {
              "type": "object/Newsletter/blocks/newsletter",
              "settings": {
                "heading": {-- $section['title'] --},
                "description": {-- $section['description'] --}
              }
            }
          }
        },
      @endif
      {{-- 图片 --}}
      @if($section['type'] === 'image')
        "{{ $id }}": {
          "type": "image",
          "settings": {
            "heading": {-- $section['title'] --},
            "heading_align": "{{ $section['align'] }}"
          },
          "blocks": {
            @if (isset($section['items']))
              @foreach ($section['items'] as $key => $item)
                "column-{{ $key }}": {
                  "type": "column",
                  "settings": {
                    "image": "{{ @$item['image']['url'] ?: '' }}",
                    "mobile_image": "{{ @$item['mb_image']['url'] ?: '' }}",
                    "url": "{{ $item['url'] }}",
                    "title": "{{ @$item['url_object']['title'] ?: '' }}"
                  }
                }@if (!$loop->last),@endif
              @endforeach
            @endif
          }
        },
      @endif
      {{-- 图文 --}}
      @if($section['type'] === 'imagetext')
        {{-- 网格 --}}
        @if($section['layout_type'] === 'grid')
          "{{ $id }}": {
            "type": "multi-column",
            "settings": {
              "heading": {-- $section['title_text'] ?: '' --},
              "heading_align": "{{ $section['title_aligns'] }}",
              "text_color": "{{ $section['text_color_v2'] }}",
              "image_size": "{{ $section['image_style'] === 'auto' ? 'auto' : 'fixed' }}",
              "mask_opacity": {{ $section['opacity'] }},
              "button_text_color": "{{ $section['button_text_color_v2'] }}",
              "button_background_color": "{{ @$section['button_bg_color_v2'] ?: '' }}",
              "text_align": "{{ $section['align'] }}"
            },
            "blocks": {
              @if (isset($section['items']))
                @foreach ($section['items'] as $key => $item)
                  "column-{{ $key }}": {
                    "type": "column",
                    "settings": {
                      "heading": {-- $item['title'] ?: '' --},
                      "text": {-- @$item['description'] ?:'' --},
                      "image": "{{ @$item['image']['url'] ?: '' }}",
                      "mobile_image": "{{ @$item['mobile_image']['url'] ?: '' }}",
                      "url": "{{ @$item['button']['url_object']['url'] }}",
                      "label": {-- $item['button']['text'] --}
                    }
                  }@if (!$loop->last),@endif
                @endforeach
              @endif
            }
          },
        @else
          {{-- 左文右图(left) --}}
          {{-- 左图右文(right) --}}
          "{{ $id }}": {
            "type": "image-text",
            "settings": {
              "heading": {-- $section['title_text'] --},
              "heading_align": "{{ $section['title_aligns'] }}",
              "image": "{{ @$section['horizontal']['image']['url'] }}",
              "image_placement": "{{ $section['layout_type'] === 'left' ? 'second' : 'first' }}",
              "horizontal_align": "{{ $section['horizontal']['level_align'] }}",
              "vertical_align": "{{ $section['horizontal']['vertical_align'] === 'flex-start' ? 'top' : ($section['horizontal']['vertical_align'] === 'flex-end' ? 'bottom' : 'middle') }}",
              "text_color": "{{ $section['text_color_v2'] }}",
              "background_color": "{{ @$section['text_bg_color_v2'] ?: '' }}"
            },
            "blocks": {
              "heading": {
                "type": "heading",
                "settings": {
                  "heading": {-- $section['horizontal']['title'] --}
                }
              },
              "text": {
                "type": "text",
                "settings": {
                  "text": {-- $section['horizontal']['description'] --}
                }
              },
              "button": {
                "type": "button",
                "settings": {
                  "url": "{{ @$section['horizontal']['button']['url_object']['url'] }}",
                  "label": {-- $section['horizontal']['button']['text'] --},
                  "text_color": "{{ $section['button_text_color_v2'] }}",
                  "background_color": "{{ $section['button_bg_color_v2'] }}"
                }
              }
            }
          },
        @endif
      @endif
    @endforeach
    "0": {
      "type": "empty"
    }
  }
}


3. The code of the compiled template file is as follows.

 
{
  "sections": {
    <?php $__currentLoopData = $homepage; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $id => $section): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
       
      <?php if($section['type'] === 'carousel'): ?>
        "<?php echo e($id); ?>": {
          "type": "carousel",
          "settings": {
            "loop": true,
            "autoplay": true,
            "height": "<?php echo e(isset($section['slide_height']) && $section['slide_height'] === 'full' ? 'full' : 'auto'); ?>",
            "interval": <?php echo e($section['interval']); ?>
 
          },
          "blocks": {
            <?php if(isset($section['items'])): ?>
              <?php $__currentLoopData = $section['items']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
                "slide-<?php echo e($key); ?>": {
                  "type": "slide",
                  "settings": {
                    "image": "<?php echo e(@$item['image']['url'] ?: ''); ?>",
                    "url": "<?php echo e($item['button']['url']); ?>",
                    "align": "<?php echo e($item['align']); ?>",
                    "title": <?php echo json_encode($item['title'], JSON_UNESCAPED_UNICODE); ?>,
                    "description": <?php echo json_encode($item['description'], JSON_UNESCAPED_UNICODE); ?>,
                    "button": <?php echo json_encode($item['button']['text'], JSON_UNESCAPED_UNICODE); ?>,
                    "opacity": <?php echo e($item['show_overlay'] ? (100 - $item['opacity']) : 100); ?>,
                    "button_background_color": "<?php echo e($item['button_background_color']); ?>",
                    "button_color": "<?php echo e($item['button_text_color']); ?>",
                    "color": "<?php echo e($item['text_color']); ?>"
                  }
                }<?php if(!$loop->last): ?>,<?php endif; ?>
              <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
            <?php endif; ?>
          }
        },
      <?php endif; ?>
       
      <?php if($section['type'] === 'collection'): ?>
        "<?php echo e($id); ?>": {
          "type": "main-collections",
          "settings": {
            "heading": <?php echo json_encode($section['title'], JSON_UNESCAPED_UNICODE); ?>
 
          },
          "blocks": {
            <?php $__currentLoopData = $section['ids']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
              "collection-<?php echo e($key); ?>": {
                "type": "collection",
                "settings": {
                  "id": <?php echo e($item); ?>
 
                }
              }<?php if(!$loop->last): ?>,<?php endif; ?>
            <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
          }
        },
      <?php endif; ?>
       
      <?php if($section['type'] === 'product'): ?>
        "<?php echo e($id); ?>": {
          "type": "main-products",
          "settings": {
            "show_product_palette": <?php echo e(@Module::find('ProductPalette')->isEnabled() && @config('product-palette.show_position') === 'all' ? 'true' : 'false'); ?>,
            "heading": <?php echo json_encode($section['title'], JSON_UNESCAPED_UNICODE); ?>,
            "layout": "<?php echo e($section['layout']); ?>",
            "page_size": <?php echo e($section['amount']); ?>
 
          },
          "blocks": {
            <?php $__currentLoopData = $section['category']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
              "collection-<?php echo e($key); ?>": {
                "type": "collection",
                "settings": {
                  "id": <?php echo e($item); ?>
 
                }
              }<?php if(!$loop->last): ?>,<?php endif; ?>
            <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
          }
        },
      <?php endif; ?>
       
      <?php if($section['type'] === 'subscribe'): ?>
        "<?php echo e($id); ?>": {
          "type": "apps",
          "blocks": {
            "newsletter": {
              "type": "object/Newsletter/blocks/newsletter",
              "settings": {
                "heading": <?php echo json_encode($section['title'], JSON_UNESCAPED_UNICODE); ?>,
                "description": <?php echo json_encode($section['description'], JSON_UNESCAPED_UNICODE); ?>
 
              }
            }
          }
        },
      <?php endif; ?>
       
      <?php if($section['type'] === 'image'): ?>
        "<?php echo e($id); ?>": {
          "type": "image",
          "settings": {
            "heading": <?php echo json_encode($section['title'], JSON_UNESCAPED_UNICODE); ?>,
            "heading_align": "<?php echo e($section['align']); ?>"
          },
          "blocks": {
            <?php if(isset($section['items'])): ?>
              <?php $__currentLoopData = $section['items']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
                "column-<?php echo e($key); ?>": {
                  "type": "column",
                  "settings": {
                    "image": "<?php echo e(@$item['image']['url'] ?: ''); ?>",
                    "mobile_image": "<?php echo e(@$item['mb_image']['url'] ?: ''); ?>",
                    "url": "<?php echo e($item['url']); ?>",
                    "title": "<?php echo e(@$item['url_object']['title'] ?: ''); ?>"
                  }
                }<?php if(!$loop->last): ?>,<?php endif; ?>
              <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
            <?php endif; ?>
          }
        },
      <?php endif; ?>
       
      <?php if($section['type'] === 'imagetext'): ?>
         
        <?php if($section['layout_type'] === 'grid'): ?>
          "<?php echo e($id); ?>": {
            "type": "multi-column",
            "settings": {
              "heading": <?php echo json_encode($section['title_text'] ?: '', JSON_UNESCAPED_UNICODE); ?>,
              "heading_align": "<?php echo e($section['title_aligns']); ?>",
              "text_color": "<?php echo e($section['text_color_v2']); ?>",
              "image_size": "<?php echo e($section['image_style'] === 'auto' ? 'auto' : 'fixed'); ?>",
              "mask_opacity": <?php echo e($section['opacity']); ?>,
              "button_text_color": "<?php echo e($section['button_text_color_v2']); ?>",
              "button_background_color": "<?php echo e(@$section['button_bg_color_v2'] ?: ''); ?>",
              "text_align": "<?php echo e($section['align']); ?>"
            },
            "blocks": {
              <?php if(isset($section['items'])): ?>
                <?php $__currentLoopData = $section['items']; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $key => $item): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
                  "column-<?php echo e($key); ?>": {
                    "type": "column",
                    "settings": {
                      "heading": <?php echo json_encode($item['title'] ?: '', JSON_UNESCAPED_UNICODE); ?>,
                      "text": <?php echo json_encode(@$item['description'] ?:'', JSON_UNESCAPED_UNICODE); ?>,
                      "image": "<?php echo e(@$item['image']['url'] ?: ''); ?>",
                      "mobile_image": "<?php echo e(@$item['mobile_image']['url'] ?: ''); ?>",
                      "url": "<?php echo e(@$item['button']['url_object']['url']); ?>",
                      "label": <?php echo json_encode($item['button']['text'], JSON_UNESCAPED_UNICODE); ?>
 
                    }
                  }<?php if(!$loop->last): ?>,<?php endif; ?>
                <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
              <?php endif; ?>
            }
          },
        <?php else: ?>
           
           
          "<?php echo e($id); ?>": {
            "type": "image-text",
            "settings": {
              "heading": <?php echo json_encode($section['title_text'], JSON_UNESCAPED_UNICODE); ?>,
              "heading_align": "<?php echo e($section['title_aligns']); ?>",
              "image": "<?php echo e(@$section['horizontal']['image']['url']); ?>",
              "image_placement": "<?php echo e($section['layout_type'] === 'left' ? 'second' : 'first'); ?>",
              "horizontal_align": "<?php echo e($section['horizontal']['level_align']); ?>",
              "vertical_align": "<?php echo e($section['horizontal']['vertical_align'] === 'flex-start' ? 'top' : ($section['horizontal']['vertical_align'] === 'flex-end' ? 'bottom' : 'middle')); ?>",
              "text_color": "<?php echo e($section['text_color_v2']); ?>",
              "background_color": "<?php echo e(@$section['text_bg_color_v2'] ?: ''); ?>"
            },
            "blocks": {
              "heading": {
                "type": "heading",
                "settings": {
                  "heading": <?php echo json_encode($section['horizontal']['title'], JSON_UNESCAPED_UNICODE); ?>
 
                }
              },
              "text": {
                "type": "text",
                "settings": {
                  "text": <?php echo json_encode($section['horizontal']['description'], JSON_UNESCAPED_UNICODE); ?>
 
                }
              },
              "button": {
                "type": "button",
                "settings": {
                  "url": "<?php echo e(@$section['horizontal']['button']['url_object']['url']); ?>",
                  "label": <?php echo json_encode($section['horizontal']['button']['text'], JSON_UNESCAPED_UNICODE); ?>,
                  "text_color": "<?php echo e($section['button_text_color_v2']); ?>",
                  "background_color": "<?php echo e($section['button_bg_color_v2']); ?>"
                }
              }
            }
          },
        <?php endif; ?>
      <?php endif; ?>
    <?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
    "0": {
      "type": "empty"
    }
  }
}
 
 

4. Decided to skip the step of compiling the PHP Blade file to the PHP template file, but manually adjust it to the compiled format, and then remove the Blade syntax in it. The following is a compiled example of Blade format. as shown in Figure 2

决定跳过将 PHP Blade 文件编译为 PHP 模板文件的这一步,而是手动调整为编译后的格式,然后去除掉其中的 Blade 语法。以下为编译后的一段 Blade 格式示例
Figure 2

5. The following is an example after removing the Blade syntax. All variables involved like $__env have been deleted. as shown in Figure 3

以下为去除掉其中的 Blade 语法后的示例。涉及到像 $__env 的变量已经全部删除
Figure 3

6. Decide to write a simple code block first to verify the feasibility of the technical solution. If feasible, try to execute the block of code generated by step 5.

{
    <?php $items = [1, 2, 3]; ?>
    <?php if(isset($items)): ?>
    <?php $count = count($items); foreach($items as $key => $item):  $count--; ?>
        "slide-<?php echo $key; ?>": {
          "type": "slide",
          "settings": {
            "image": "<?php echo $item ?: ''; ?>"
          }
        }<?php if($count != 0): ?>,<?php endif; ?>
    <?php endforeach;  ?>
    <?php endif; ?>
}

7. Run the file (phpcode.php) where this code is located directly, and the result is converted into a json structure, which is in line with expectations. as shown in Figure 4

直接运行此代码所在的文件(phpcode.php),其结果转换为 json 结构,符合预期
Figure 4

{
					"slide-0": {
		  "type": "slide",
		  "settings": {
			"image": "1"
		  }
		},			"slide-1": {
		  "type": "slide",
		  "settings": {
			"image": "2"
		  }
		},			"slide-2": {
		  "type": "slide",
		  "settings": {
			"image": "3"
		  }
		}		}




8. Now you need to create a new PHP script, and then use the output buffer to include a PHP file into a string. Reference:https://www.php.net/manual/zh/function.include.php, create a new php file ob.php, after running, the output json structure is in line with expectations. as shown in Figure 5

现在需要新建一个 PHP 脚本,然后使用输出缓冲来将 PHP 文件包含入一个字符串
Figure 5
<?php
 
$string = get_include_contents('phpcode.php');
echo $string;
 
function get_include_contents($filename) {
    if (is_file($filename)) {
        ob_start();
        include $filename;
        $contents = ob_get_contents();
        ob_end_clean();
        return $contents;
    }
    return false;
}

9. However, because the front-end colleagues think that the scheme of adjusting the template to PHP’s native syntax is poor readability, the workload is too large. The backend is still required to automate all the processes, and also include the process of Blade compiled into a PHP template. The final implementation is as follows

/*
$filename = $directory . '/' . substr($themeAsset->asset_key, 6);
if (Storage::disk('local')->exists($filename)) {
	ob_start();
	include storage_path('app') . '/' . $filename;
	$contents = ob_get_contents();
	ob_end_clean();
	$themeAsset->schema = $contents;
	$themeAsset->save();
}
*/
View::addLocation(storage_path('app') . '/' . $directory);
$filename = substr(substr($originalThemeAsset->asset_key, 0, strpos($originalThemeAsset->asset_key, '.')), 6);
$variables = $this->getBladeSchemaCompilerVariables($filename, $originalThemeInstallation->theme);
$schema = View::make($filename)->with($variables)->render();
$themeAsset->schema = $schema;
$themeAsset->save();


PHP / Laravel / Yii2 Legacy Project Maintenance & Long-Term Technical Support

If your PHP / Laravel / Yii2 project is already in production but needs bug fixing, API troubleshooting, performance optimization, developer handover support, or long-term maintenance, feel free to contact me for remote technical support.

Ideal For:
✅ PHP legacy systems without active maintenance
✅ Laravel / Yii2 project bug fixes
✅ Admin panel feature iterations
✅ RESTful API troubleshooting
✅ MySQL / Redis / Nginx performance issues
✅ Long-term remote part-time maintenance

We can start with a small task:
✅ Production error troubleshooting
✅ API issue analysis
✅ Slow query and performance bottleneck diagnosis
✅ Initial code structure review
✅ Deployment environment and log inspection

If you would like to discuss your project, please contact me and mention: PHP Maintenance Consultation.

Contact Me:
Telegram: @shuijingwan
WeChat: 13980074657
Email: shuijingwanwq@gmail.com

评论

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.