Laravel - blade @yield игнорирует вкладки при предоставлении пользователю html - PullRequest
0 голосов
/ 05 октября 2018

Так что я получаю странный результат, который я не могу обернуть вокруг себя.Это просто вопрос того, как красиво выглядит HTML в источнике, но это немного раздражает, так как иногда делает отступы непоследовательными.

Вот файл layout.blade.php, игнорирующий большую часть HTML над разделом:

            </div>
            <div class="content">
                @yield('content')
            </div>
        </div>
    </body>
</html>

Вот index.blade.php, который расширяет layout.blade.php:

@extends('layout')   

@section('content')

<div class="main-title">
    <h1>Developer</h1>
    <svg>
        <line x1="0" y1="0" x2="300" y2="0" style="stroke:rgb(255,255,255);stroke-width:10" />
    </svg>
    <h1>Designer</h1>
</div>

@stop

Я бы предположил, что это будет на том же уровне отступа, что и @yield (), как это происходит в шаблоне django и в учебниках по laravel.

Вот что я получаю вместо этого:

            <div class="content">

<div class="main-title">
    <h1>Developer</h1>
    <svg>
        <line x1="0" y1="0" x2="300" y2="0" style="stroke:rgb(255,255,255);stroke-width:10" />
    </svg>
    <h1>Designer</h1>
</div>

            </div>
        </div>
    </body>
</html>

Как вы можете видеть, контент не является местом, где @yield () был помещен в layout.blade.php.

Просмотр созданного php-файла, который обслуживается. Похоже, все должно быть в порядке:

            </div>
            <div class="content">
                <?php echo $__env->yieldContent('content'); ?>
            </div>
        </div>
    </body>
</html>

Сгенерировано из index.blade.php:

<?php $__env->startSection('content'); ?>

                <div class="main-title">
                    <h1>Developer</h1>
                    <svg>
                        <line x1="0" y1="0" x2="300" y2="0" style="stroke:rgb(255,255,255);stroke-width:10" />
                    </svg>
                    <h1>Designer</h1>
                </div>

<?php $__env->stopSection(); ?>
<?php echo $__env->make('layout', \Illuminate\Support\Arr::except(get_defined_vars(), array('__data', '__path')))->render(); ?>

Всеоб этом приводит меня к предположению, что обслуживаемый html будет иметь пропуски между пробками, но это не так.В чем может быть причина?Может ли быть какая-то конфигурация или это просто причудливый клинок?

Ответы [ 2 ]

0 голосов
/ 21 июля 2019

Меня это тоже беспокоило, и поскольку это не будет исправлено в самом Laravel Я решил исправить это в пакете, который распространяется на блейд-компилятор .Регулярное выражение, которое находит синтаксис блейда в шаблонах, теперь включает любые горизонтальные пробелы, ведущие к оператору блейда, и передает его в результирующий оператор PHP, который отображает содержимое.После любой новой строки в замененном контенте добавляется интервал, и если замененный контент не имеет завершающей новой строки, он также добавляется.Надеюсь, это поможет любому, кто сталкивается с этим!

0 голосов
/ 06 октября 2018

В чем может быть причина?Может ли быть какая-то конфигурация или это просто причуда?

Причина в том, что именно так работает PHP и как Blade-лезвие Laravel как конструкция поверх PHP может достичь того, что делает.Директива @yield('content') представляет собой вызов функции : echo $__env->yieldContent('content');.Вы уже догадались. Здесь реализация .

Теперь дело в том, что функция принимает 'content' в качестве входного параметра.Что касается того, как функции работают в PHP (и большинстве императивных языков программирования), он не знает о предыдущих пробелах, которые вы указали в качестве отступа, он просто не может использовать его в качестве параметра, используя этот синтаксис.Учтите, что если бы этот пример действительно работал так, как вы ожидали, это означало бы нарушение синтаксиса и семантики PHP, и многие другие вещи, которые сейчас работают, внезапно перестали бы работать, поскольку сам язык должен поддерживать согласованность синтаксических конструкций 1019 *.

Конечно, то, что вы утверждаете, является правильным в том смысле, что оно может выглядеть " немного похоже на досадную причуду " с точки зрения разработчика или пользователя, но этоникогда не говорилось, что blade-сервер или PHP должны работать таким образом, а это означает, что это не ожидаемая функция.

Теперь, если вы хотите получить измененный выходной код, есть много способов применить фильтры, оба для минимизации /обфускация или префтификация, например промежуточные фильтры .Конечно, эти подходы могут потребовать некоторой вычислительной мощности, которую вы оцените исходя из своих потребностей и среды (локальной или prd).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...