Я использую Laravel 5. Я хотел бы знать, какие все переменные переданы в представление внутри самого представления.
Поскольку все переменные находятся в области представления, я думал, что могу использовать общую функцию PHP: get_defined_vars();
http://php.net/manual/en/function.get-defined-vars.php
Что-то вроде этого:
// resources/view/home.blade.php <html> <body> <?php print_r(get_defined_vars()); ?> </body> </html>
Но я хотел бы знать, есть ли лучший способ (что-то вроде View::getData()
)
Примечание: get_defined_vars () не работает, потому что он возвращает сотни бесполезных переменных (компоненты Laravel)
Это фрагмент (частичный) с использованием print_r(get_defined_vars())
(я думаю, что он идет в бесконечном цикле рекурсии):
Array ( [__path] => C:\net\laravel\storage\framework\views/8e030a77b0bdbacc2c4182fc04420d1d [__data] => Array ( [__env] => Illuminate\View\Factory Object ( [engines:protected] => Illuminate\View\Engines\EngineResolver Object ( [resolvers:protected] => Array ( [php] => Closure Object ( [this] => Illuminate\View\ViewServiceProvider Object ( [app:protected] => Illuminate\Foundation\Application Object ( [basePath:protected] => C:\net\laravel [hasBeenBootstrapped:protected] => 1 [booted:protected] => 1 [bootingCallbacks:protected] => Array ( [0] => Closure Object ( [static] => Array ( [instance] => Illuminate\Bus\BusServiceProvider Object ( [defer:protected] => 1 [app:protected] => Illuminate\Foundation\Application Object *RECURSION* ) ) [this] => Illuminate\Foundation\Application Object *RECURSION* ) [1] => Closure Object ( [static] => Array ( [instance] => Illuminate\Translation\TranslationServiceProvider Object ( [defer:protected] => 1 [app:protected] => Illuminate\Foundation\Application Object *RECURSION* ) ) [this] => Illuminate\Foundation\Application Object *RECURSION* ) ) [bootedCallbacks:protected] => Array ( ) [terminatingCallbacks:protected] => Array ( ) [serviceProviders:protected] => Array ( [0] => Illuminate\Events\EventServiceProvider Object ( [app:protected] => Illuminate\Foundation\Application Object *RECURSION* [defer:protected] => )
Используйте помощник dd
:
{{ dd(get_defined_vars()) }}
Подробнее: https://laravel.com/docs/5.4/helpers#method-dd
Update (thx, @JoeCoder): вы можете дополнительно сократить «бесполезные» переменные, выполнив:
{{ dd(get_defined_vars()['__data']) }}
Если вы используете Laravel 5.1, который теперь позволяет расширять Blade с помощью настраиваемых директив, вы можете найти это полезным. Вам необходимо зарегистрировать директивы в AppServiceProvider, как в этом примере, или создать собственный провайдер.
/** * Blade directive to dump template variables. Accepts single parameter * but also could be invoked without parameters to dump all defined variables. * It does not stop script execution. * @example @d * @example @d(auth()->user()) */ Blade::directive('d', function ($data) { return sprintf("<?php (new Illuminate\Support\Debug\Dumper)->dump(%s); ?>", null !== $data ? $data : "get_defined_vars()['__data']" ); }); /** * Blade directive to dump template variables. Accepts single parameter * but also could be invoked without parameters to dump all defined variables. * It works similar to dd() function and does stop script execution. * @example @dd * @example @dd(auth()->user()) */ Blade::directive('dd', function ($data) { return sprintf("<?php (new Illuminate\Support\Debug\Dumper)->dump(%s); exit; ?>", null !== $data ? $data : "get_defined_vars()['__data']" ); });
Для лучшей читаемости и отладки вы также можете создать помощник, который превращает вывод в массив.
//add this to /vendor/laravel/framework/src/Illuminate/Support/helpers.php if (! function_exists('da')) { /** * Dump the passed variables to array and end the script. * * @param mixed * @return void */ function da() { array_map(function ($x) { dd($x->toArray()); }, func_get_args()); } }