2015-06-08 42 views
2

我正在考慮添加一個@link刀片指令。類似於@link($user)並將其轉換爲<a href="/user/$user->id">$user->name</a>替代爲laravel添加@link blade指令

我可以隨着時間的推移使其更加複雜,其中鏈接取決於$user的類型,如$order等。我可以向對象添加方法,如getHref和getLinkName。

這似乎是一個很好的和簡單的想法,但我沒有看到其他人在線做這種模式。

我所知道的一些替代方式來表達相同的,例如{{$用戶> makeLink()}},{{$ linkMaker->鏈接($用戶}},link_to_ *

我的問題是,這是否做過?有沒有使用刀片指令生成鏈接的包?

如果以前沒有做過,是否有理由避免它?例如,在5.1該文檔已經刪除了Blade :: extends。或者,它是一個不錯的主意,讓刀片模板生成HTML,它被設計爲輸出字符串。

下面的代碼工作 - 我的問題是我應該usi在其他人的包裹中,或不同的模式。

\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); 
    }); 
+1

是的,這裏是一個包提供給你像'link_to','link_to_route'等功能。https://github.com/LaravelCollective/html。它是Laravel的一部分,但自從'5. *'以來已被刪除。以下是http://laravel.com/docs/4.2/helpers#urls的文檔。我喜歡你的想法,把它包裝成刀片指令。最近我在想同樣的 –

回答

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) 
0

illuminate\html包有一個用於生成鏈接(link_to()link_to_asset()link_to_route()link_to_action())的輔助功能。這些幫助程序的文檔仍可以在Laravel 4文檔here中找到。

該軟件包已從Laravel 5中刪除,但可以重新添加,沒有任何問題。

所以,與其@link($user),刀片語法將{!! link_to_route('user.show', $user->name, [$user->id]) !!}

+0

是否有理由更喜歡更詳細的{! link_to_route('user.show',$ user-> name,[$ user-> id])!!} to @link($ user) – mrwaim

+1

@mrwaim只要它已經存在。我並不是說這樣比較好,只是讓你知道它在那裏。 – patricus

0

的第一個原因,不使用刀片的模板,是它難以處理括號。

@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($ user)!!}和@link($ user)是邊緣的。

上面的代碼是相當具體的 - 但總體思路是刀片擴展適用於小型和簡單的HTML轉換,對於任何更復雜的事情來說,它變得很困難。