Использовать данные руля в функции шаблона блейда Laravel

#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 `.