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

时间:2015-06-08 04:01:13

标签: php laravel laravel-5 blade

我考虑添加@link刀片指令。类似于@link($user)的内容,并将其转换为<a href="/user/$user->id">$user->name</a>

我可以随着时间的推移变得更复杂,链接取决于$user的类型,如$order等。我可以向对象添加方法,如getHref和getLinkName。

这似乎是一个好的和简单的想法,但我没有看到其他人在网上做这种模式。

我知道一些表达相同的方法,例如{{$ user-&gt; makeLink()}},{{$ linkMaker-&gt; 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);
    });

3 个答案:

答案 0 :(得分:0)

我认为您可以使用Blade::extend进行此操作,如Blade Extensions in LaravelBlade 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中。像

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

位于文件底部。

然后您可以在刀片模板中使用以下内容来使用此新刀片命令

@userlink(30)

答案 1 :(得分:0)

illuminate\html包具有用于生成链接的辅助函数(link_to()link_to_asset()link_to_route()link_to_action())。这些助手的文档仍然可以在Laravel 4 docs here中找到。

此程序包已从Laravel 5中删除,但可以毫无问题地重新添加。

因此,您的刀片语法不是@link($user),而是{!! link_to_route('user.show', $user->name, [$user->id]) !!}

答案 2 :(得分:0)

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

@link($ reportManager-&gt; getBestUser())无法解析。你可以修复正则表达式,但这可能会让事情变得更糟。

第二个原因是,实现了('$_SERVER[SERVER_ADDR]') ,它带来的复杂性是要求输出PHP片段,而不是简单的HTML或闭包。

输出PHP代码段更难扩展。

例如,要添加条件,如果用户是管理员,或者用户自己,或者他们向用户报告,他们会看到一个链接,否则他们只看到名称。

这是它的样子

@link

它不漂亮,难以进一步扩展。

“逻辑”下一步是将@link转换为

但是,make_link已经编码并注册,然后是{!! make_link($ user)!!}与@link($ user)是边缘的。

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