Php 为laravel添加@link刀片指令的替代方案
我正在考虑添加一个Php 为laravel添加@link刀片指令的替代方案,php,laravel,laravel-5,blade,Php,Laravel,Laravel 5,Blade,我正在考虑添加一个@linkblade指令。类似于@link($user)并将其转换为 随着时间的推移,我可以使它变得更加复杂,其中链接取决于$user的类型,如$order等。我可以向对象添加方法,如getHref和getLinkName 这似乎是一个简单的好主意,但我没有看到其他人在网上这样做 我知道有几种不同的表达方法,例如{{$user->makeLink()},{{$linkMaker->link($user}}},link\u to_* 我的问题是,以前有没有这样做过?有没有使用刀片
@link
blade指令。类似于@link($user)
并将其转换为
随着时间的推移,我可以使它变得更加复杂,其中链接取决于$user
的类型,如$order
等。我可以向对象添加方法,如getHref和getLinkName
这似乎是一个简单的好主意,但我没有看到其他人在网上这样做
我知道有几种不同的表达方法,例如{{$user->makeLink()},{{$linkMaker->link($user}}},link\u to_*
我的问题是,以前有没有这样做过?有没有使用刀片指令生成链接的包
如果以前没有这样做过,有没有理由避免这样做?例如,在5.1中,文档删除了Blade::extends。或者,让Blade模板生成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);
});
\Blade::extend(函数($view,$compiler){
$pattern=“/(?我认为您可以使用Blade::extend
,如中所述,在您的情况下,您可以创建类似于以下内容的代码:
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>';
});
在文件的底部
然后,您可以在刀片模板中使用以下命令来使用此新刀片命令
@userlink(30)
lightlight\html
包具有用于生成链接的帮助函数(link\u to()
,link\u to\u asset()
,link\u to\u route()
,link\u to\u action()
)。这些帮助程序的文档仍然可以在Laravel 4文档中找到
该软件包已从Laravel5中删除,但可以毫无问题地重新添加
因此,代替@link($user)
,您的刀片语法将是{!!link_to_route('user.show',$user->name,[$user->id])!!
不使用刀片模板的第一个原因是难以处理括号
@链接($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);
});
\Blade::extend(函数($view,$compiler){
$pattern=”/(?是的,这是一个软件包,它为您提供了诸如链接到,链接到路由等功能。它是Laravel的一部分,但从5.*
起就被删除了。这是它的文档。我喜欢您关于将其包装到刀片指令的想法。最近我在考虑同样的问题,有理由更喜欢它更详细的{!!link_to_route('user.show',$user->name,[$user->id])!!}到@link($user)@mrwaim只是它已经存在了。我不是说它更好,只是让你知道它已经存在了。
\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);
});