2015-06-08 1 views
2

Я рассматриваю возможность добавления директивы blade-сервера @link. Что-то вроде @link($user) и конвертируйте это в <a href="/user/$user->id">$user->name</a>.Альтернативы добавлению директивы blade-сервера @link для laravel

Я могу со временем усложнить ситуацию, когда ссылка зависит от типа $user, например $order и т. Д. Я могу добавлять методы к объекту, например getHref и getLinkName.

Похоже, что это хорошая и простая идея, но я не вижу, чтобы кто-то еще делал эту схему онлайн.

Я знаю несколько альтернативных способов выразить то же самое, например, {{$ user-> MakeLink()}}, {{$ linkMaker-> ссылка ($ пользователя}}, link_to_ *

Мой вопрос: было ли это сделано раньше? Существует ли пакет, который использует директивы blade-сервера для создания ссылки?

Если это не было сделано раньше, есть ли причина, чтобы избежать этого? Например, в 5.1 документация удалила Blade :: extends. Или, ее плохая идея, чтобы шаблоны клипов генерировали HTML, он был разработан для вывода строки.

Код ниже работает - мой вопрос: должен ли я быть usi чужой пакет или другой шаблон.

\Blade::extend(function($view, $compiler) { 
     $pattern = "/(?<!\w)(\s*)@link\(\s*(.*?)\)/"; 
     return preg_replace($pattern, '$1<a href="/user-management/view/<?php echo $2->getRouteKey() ?>"><?php echo $2->name ?></a>', $view); 
    }); 
+1

Да, вот пакет, который предоставляет вам такие функции, как 'link_to',' link_to_route' и т. Д. Https://github.com/LaravelCollective/html. Он был частью Laravel, но был удален с '5. *'. Вот документация для него http://laravel.com/docs/4.2/helpers#urls. И мне нравится ваша идея обматывать его с помощью директивы blade-сервера. В последнее время я думаю о том же –

ответ

0

Я думаю, что вы можете использовать Blade::extend для этого, как описано в Blade Extensions in Laravel и Blade Extensions in Laravel 4 в вашем случае вы можете создать код, похожий на следующий:

Blade::extend(function ($view, $compiler) { 
    $pattern = '/\s*@userlink\(\s*([0-9]*)\s*\)/'; 
    preg_match($pattern, $view, $matches); 
    $userId = $matches[1]; 
    $user = User::findOrFail($userId); 
    return '<a href="/user/'.$user->id.'">'.$user->name.'</a>'; 
}); 

Место выше кода в файле, например, app/blades.php и требуют их в файле среды (то есть app/start/local.php). Если вы не указали среду, поместите их в app/start/global.php. Как

в нижней части файла.

, а затем вы можете использовать следующие в шаблоне лезвия, чтобы использовать эту новую команду режущего диска

@userlink(30) 
0

Пакет illuminate\html имеет вспомогательные функции для генерации ссылок (link_to(), link_to_asset(), link_to_route(), link_to_action()). Документацию для этих помощников можно найти в документах Laravel 4 here.

Этот пакет был удален из Laravel 5, но его можно добавить обратно без проблем.

Таким образом, вместо @link($user), ваш синтаксис лопасть будет {!! link_to_route('user.show', $user->name, [$user->id]) !!}

+0

Есть ли причина предпочитать более подробные {!! link_to_route ('user.show', $ user-> name, [$ user-> id]) !!} to @link ($ user) – mrwaim

+1

@mrwaim Только, что он уже существует. Я не говорил, что это лучше, просто сообщив, что это было там. – patricus

0

Первая причина, чтобы не использовать шаблоны лезвий, является то, что трудно обрабатывать скобку.

@link ($ reportManager-> getBestUser()) не удалось проанализировать. Вы можете исправить регулярное выражение, но это может ухудшить ситуацию.

Вторая причина, внедрившая @link, сложность, связанная с этим, является требованием для вывода фрагмента PHP, а не простого HTML или закрытия.

Вывод PHP-фрагмента сложнее расширить.

Например, чтобы добавить условие, если пользователь является администратором или самим пользователем, или если они сообщают пользователю, они видят ссылку, иначе они видят только имя.

Вот как это выглядит

\Blade::extend(function($view, $compiler) { 
    $pattern = "/(?<!\w)(\s*)@link\(\s*(.*?)\)/"; 
    return preg_replace($pattern, '$1' 
     . '<?php if($auth->admin || $auth->id == $2->id || $auth->id == $2->referral_id) {?>' . PHP_EOL 
     . '<a href="/user-management/view/<?php echo $2->getRouteKey() ?>">' . PHP_EOL 
     . '<?php echo $2->name ?>' . PHP_EOL 
     . '</a>' . PHP_EOL 
     . '<?php } else { ?>' . PHP_EOL 
     . '<?php echo $2->name ?>' . PHP_EOL 
     . '<?php }?>', $view); 
}); 

Ее не очень, и трудно расширяться дальше.

«Логический» следующий шаг затем @link преобразовать в

Однако make_link был закодирован и зарегистрирован, то значение {!! make_link ($ user) !!} против @link ($ user) является маргинальным.

Код, приведенный выше, является довольно конкретным, но общая идея заключается в том, что расширения лезвий лучше всего подходят для небольших и простых преобразований HTML, и для чего-то более сложного становится трудным.

Смежные вопросы