#php #laravel #handlebars.js #blade #mustache
#php #laravel #handlebars.js #laravel-blade #усы
Вопрос:
Я хочу использовать данные руля (т.Е. {{ id }}
) в качестве параметра в вспомогательной функции Laravel в представлении шаблона .blade.
Я знаю об экранировании скобок руля при использовании.blade.php расширение типа @{{#each users}}
или @{{ name }}
, и это работает отлично.
Проблема возникает, когда я хочу использовать @{{ id}}
вспомогательную функцию Laravel из-за вложенных двойных фигурных скобок:
<a href="#" class="btn btn-xs btn-warning" data-route="{{ route('admin.membership.toggle-show-hide', ['id' => @{{ id }}]) }}">
Hide
</a>
Я знаю, что это не может работать, потому что вспомогательная функция route
не ожидает фигурных скобок в массиве параметров, но мне все равно нужно каким-то образом передавать данные из Handlebars contex во вспомогательную функцию Laravel в представлении шаблона блейда.
Я пробовал разные способы добиться этого, но безуспешно.
Кто-нибудь знает какой-нибудь обходной путь или имеет какие-либо идеи для этого? Заранее благодарю вас всех.
Редактировать
Альтернативой (которую я использую в настоящее время) является написание помощника Handlebars, который примет необходимый параметр и сгенерирует маршрут для некоторого действия:
Handlebars.registerHelper("mmbrshpToggleShowHideRoute", function(id) {
return APP_URL '/admin/membership/' id '/toggleShowHide';
});
Используя это, я могу сгенерировать строку маршрута в шаблоне руля (с помощью .blade.php расширение) для каждого элемента в контексте JSON Handlebars, полученного из контроллера Laravel:
<a href="#" class="btn btn-xs btn-success" data-route="{{ mmbrshpToggleShowHideRoute id }}">
Hide
</a>
Мне не нравится этот подход, потому что я фактически жестко кодирую URL-адрес маршрута в вспомогательной функции Handlebars. Это работает и обеспечивает возможность повторного использования во всех представлениях и шаблонах, но было бы лучше, если бы была возможность сгенерировать маршрут с помощью route
вспомогательной функции Laravel и просто передать id
параметр из контекста руля.
Ответ №1:
Если вам действительно нужно «пуленепробиваемое» решение для изменения маршрутов на интерфейсе, то наиболее удобным решением является создание средства доступа для маршрута в вашей модели. Что-то вроде этого:
public function getRouteAttribute()
{
return route('admin.membership.toggle-show-hide', ['id' => $this->id]);
}
Затем вам нужно убедиться, что средство доступа всегда доступно (даже если вы возвращаете ответ JSON) в экземплярах вашего объекта, используя свойство $appends, подобное этому:
protected $appends = ['route'];
Так и должно быть.
Комментарии:
1. Это действительно хорошее решение, которое устраняет необходимость беспокоиться о маршрутах ресурсов во внешнем интерфейсе (javascript). Таким образом, маршруты, необходимые в шаблоне руля, всегда доступны и действительны. Спасибо 😉
Ответ №2:
На самом деле вы не можете использовать переменные / функции JS и PHP одновременно, поскольку переменные JS могут меняться со временем во время сеанса PHP.
Когда задействован JS, я не использую маршруты, я использую простые строковые маршруты, такие как data-route="'/admin/membership/toggle/' id"
Комментарии:
1. Спасибо за ваш ответ. Я не хочу жестко кодировать маршрут, потому что маршрут может меняться со временем, и тогда мне нужно будет изменить «строковые маршруты» в каждом шаблоне руля и других местах, где используется этот маршрут. Из-за этого я хочу использовать вспомогательную функцию Laravel
route
и просто передатьid
параметр в качестве выражения Handlebars ({{ id }}
это просто шаблонное выражение, и оно отлично работает, когда оно не используется вroute
helper или любом другом операторе, уже заключенном в фигурные скобки).2. Да, я понял ваш вопрос, но, как я уже сказал, невозможно использовать переменные JS (Handlebar) в функции PHP (
route()
например, Laravel). Если вы боитесь изменения маршрутов (что на самом деле происходит не так часто в реальном проекте), вы всегда можете создать JS-файл, в котором вы регистрируете все свои маршруты. В случае, если вы действительно измените свои маршруты, у вас будет только 1 JS-файл для редактирования.3. Несколько минут назад я обновил свой вопрос альтернативой, которую я использую в настоящее время. Вы имели в виду что-то подобное? Это работает действительно хорошо, но я подумал, есть ли какой-нибудь «более чистый» способ сделать это.
4. Да, что-то подобное достаточно чисто. Вы не должны слишком беспокоиться о маршрутах, изменяющихся со временем, это действительно происходит не так часто, когда вы работаете
5. Спасибо. Я просто хотел воспользоваться вспомогательными функциями Laravel вместе с шаблоном Handlebars. Мне потребуется немного больше времени, чтобы попытаться найти какое-то лучшее решение, чем регистрация помощников HB, но, как вы сказали, возможно, мне не стоит слишком беспокоиться о маршрутах, меняющихся со временем 😉
Ответ №3:
Вы можете использовать этот пример кода.
<a href=".URL::route('admin.membership.toggle-show-hide',[$id])." class="btn-blue">Hide</a>
Ответ №4:
Найдено решение. Вдруг кому нужно ввести описание изображения здесь
От
{{ route('admin.membership.toggle-show-hide', ['id' => @{{ id }}]) }}
Для
<?php echo route('admin.membership.toggle-show-hide', ['id' => {{ id }}]) ?>
Ответ №5:
У меня была такая же проблема в handlebars, я решил ее с помощью этого решения
моя проблема: <button type="button" class="btn bg-orange btn-flat margin"><a href="{{ route('employee.purchases.show',[@{{ category_id }}]) }}"> View PO</a></button>
для этого: <button type="button" class="btn bg-orange btn-flat margin"> <a href="../purchases/@{{ category_id }}/show" target="_blank">View PO</a> </button>
убедитесь, что у вас есть маршруты, объявленные в вашем web.php
Комментарии:
1. Пожалуйста, отформатируйте свой код как код, используя функцию `code `.