Алтернативи на добавяне на директива @link blade за laravel

Обмислям да добавя @link blade директива. Нещо като @link($user) и преобразувайте това в <a href="/bg/user/$user->id">$user->name</a>.

С течение на времето мога да го направя по-сложно, където връзката зависи от типа на $user, като $order и т.н. Мога да добавя методи към обекта, като getHref и getLinkName.

Изглежда като добра и проста идея, но не виждам някой друг да прави този модел онлайн.

Наясно съм с няколко алтернативни начина за изразяване на същото, например {{$user->makeLink()}}, {{$linkMaker->link($user}}, link_to_*

Въпросът ми е, правено ли е това преди? Има ли пакет, който използва blade директиви за генериране на връзка?

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

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

    \Blade::extend(function($view, $compiler) {
        $pattern = "/(?<!\w)(\s*)@link\(\s*(.*?)\)/";
        return preg_replace($pattern, '$1<a href="/bg/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 за това, както е описано в Блейд разширения в Laravel и Разширения на Blade в 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="/bg/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="/bg/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