Альтернативы добавлению блейд-директивы @link для laravel

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

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

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

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

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

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

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

    \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);
    });

person mrwaim    schedule 08.06.2015    source источник
comment
Да, вот пакет, который предоставляет вам такие функции, как link_to, link_to_route и т. д. github.com/LaravelCollective/html< /а> . Он был частью Laravel, но был удален с 5.*. Вот документация для него laravel.com/docs/4.2/helpers#urls. И мне нравится твоя идея о том, чтобы обернуть это в директиву лезвия. В последнее время я думаю о том же   -  person Anatoliy Arkhipov    schedule 08.06.2015


Ответы (3)


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

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

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

person patricus    schedule 08.06.2015
comment
Есть ли причина предпочесть более подробный {!! link_to_route('user.show', $user-›name, [$user-›id]) !!} на @link($user) - person mrwaim; 08.06.2015
comment
@mrwaim Просто он уже существует. Я не говорил, что это лучше, просто дал вам знать, что это было там. - person patricus; 08.06.2015

Я думаю, вы можете использовать Blade::extend для этого, как описано в Расширения Blade в Laravel и Blade Extensions в 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. Нравиться

require app_path()."/blades.php";

внизу файла.

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

@userlink(30)
person Dharmesh Patel    schedule 08.06.2015

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

@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, а для чего-то более сложного это становится трудным.

person mrwaim    schedule 14.06.2015