Is there any way to compile a blade template from a string?

前端 未结 6 1589
滥情空心
滥情空心 2020-11-27 07:32

How can I compile a blade template from a string rather than a view file, like the code below:

{{ $name }}\';
echo          


        
6条回答
  •  無奈伤痛
    2020-11-27 07:56

    I know its pretty old thread, but today also requirement is same.

    Following is the way I solved this on my Laravel 5.7 (but this will work with any laravel version greater than version 5), I used the knowledge gained from this thread and few other threads to get this working (will leave links to all threads at the end, if this help up-vote those too)

    I added this to my helper.php (I used this technique to add helper to my project, but you can use this function directly as well)

    if (! function_exists('inline_view')) {
        /**
         * Get the evaluated view contents for the given blade string.
         *
         * @param  string  $view
         * @param  array   $data
         * @param  array   $mergeData
         * @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
         */
        function inline_view($view = null, $data = [], $mergeData = [])
        {
            /* Create a file with name as hash of the passed string */
            $filename = hash('sha1', $view);
    
            /* Putting it in storage/framework/views so that these files get cleared on `php artisan view:clear*/
            $file_location = storage_path('framework/views/');
            $filepath = storage_path('framework/views/'.$filename.'.blade.php');
    
            /* Create file only if it doesn't exist */
            if (!file_exists($filepath)) {
                file_put_contents($filepath, $view);
            }
            
            /* Add storage/framework/views as a location from where view files can be picked, used in make function below */
            view()->addLocation($file_location);
    
            /* call the usual view helper to render the blade file created above */
            return view($filename, $data, $mergeData);
        }
    } 
    

    Usage is exactly same as laravel's view() helper, only that now first parameter is the blade string

                $view_string = '@if(strlen($name_html)>6)
                                    {{ $name_html }}
                                @else 
                                    {{$name_html}} 
                                @endif';
                return inline_view($view_string)->with('name_html', $user->name);
                return inline_view($view_string, ['name_html' => $user->name]);
    

    References:

    1. https://stackoverflow.com/a/31435824/4249775
    2. https://stackoverflow.com/a/33594452/4249775

提交回复
热议问题