我考虑添加@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);
});
答案 0 :(得分: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
中。像
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转换,而对于任何更复杂的代码,它变得很困难。