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);
});