为laravel添加@link blade指令的替代方案


Alternatives to adding an @link blade directive for 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);
    });

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]) !!}

我认为你可以使用Blade::extend来实现这一点,如Laravel的刀片扩展和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)

不使用刀片模板的第一个原因是很难处理括号。

@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(用户)美元! !}和@link($user)是不重要的。

上面的代码是相当具体的—但是一般的想法是刀片扩展最适合小型和简单的HTML转换,而对于任何更复杂的转换,它就变得困难了。