Laravel Blade 使用自定义函数

Posted

技术标签:

【中文标题】Laravel Blade 使用自定义函数【英文标题】:Laravel Blade Using custom function 【发布时间】:2018-03-13 11:19:30 【问题描述】:

我有一个刀片,用于打印表格的内容。 对于某些列,我需要根据要打印的值添加 CSS 类。

例如如果它是“OK”,则添加绿色类,否则添加红色类。 当然逻辑会比较复杂,但重点是所有的逻辑都会跟风格有关。

保存此类函数/方法的最佳推荐位置是哪一个? 我需要创建模型吗?

** 更新 **

            <thead>                                     
                <tr>                   
                    <th> ID </th>
                    <th> Name </th>
                    <th> Last Checked </th>
                    <th> Status </th>                    
                </tr>                                                   
            </thead>                                                    
            <tbody>     
                @foreach ($users as $u)
                    <tr>               
                        <td>  $u->id </td>
                        <td>  $u->name </td>
                        <td>  $u->last_login </td>
                        <td> !! statusWrapper( $u->status ) !!</td>
                    </tr>              
                @endforeach                                                      
            </tbody>                                                                         
        </table>          

“statusWrapper”是我想调用来装饰状态值的函数。 所以状态是一个数字,输出类似于&lt;span class="..."&gt; .... &lt;/span&gt;

【问题讨论】:

如果是简单的逻辑,放在你的视野里? 为什么需要模型?它非常简单。分享你已经实现的一些代码。 @ProEvilz,如果逻辑有点复杂,或者我可以与多个视图共享,该怎么办? @MahfuzShishir,我已经用代码示例更新了问题 【参考方案1】:

如果您打算在多个刀片模板中使用该功能,那么Tohid's answer 是最好的。

如果只需要单个模板中的函数,可以直接在.blade.php文件中定义如下:

@php
if ( !function_exists( 'mytemplatefunction' ) ) 
   function mytemplatefunction( $param ) 
      return $param . " World";
   
 
 @endphp

然后你可以在同一个模板中调用函数:

<p> mytemplatefunction("Hello") </p>

如果您在同一会话中多次包含刀片模板,则需要条件函数定义。

【讨论】:

【参考方案2】:

app/providers/AppServiceProvider.php(如果您愿意,可以创建不同的服务提供者)

use Illuminate\Support\Facades\Blade;

...

class AppServiceProvider extends ServiceProvider


    ...


    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    
        Blade::directive('statusWrapper', function ($status) 
            return "<?php echo App\ViewComponents\StatusWrapperComponent::statusWrapper( $status ); ?>"; 
        );
    

app/ViewComponents/StatusWrapperComponent.php

namespace App\ViewComponents;

class StatusWrapperComponent 

    public static function statusWrapper ($status) 
        if($status == 'good')
            echo '<span style="color: green;">thats really good</span>';
        else
            echo '<span style="color: red;">not good</span>';
    


resources/views/yourview.blade.php

<thead>                                     
                <tr>                   
                    <th> ID </th>
                    <th> Name </th>
                    <th> Last Checked </th>
                    <th> Status </th>                    
                </tr>                                                   
            </thead>                                                    
            <tbody>     
                @foreach ($users as $u)
                    <tr>               
                        <td>  $u->id </td>
                        <td>  $u->name </td>
                        <td>  $u->last_login </td>
                        <td> @statusWrapper($u->status) </td>
                    </tr>              
                @endforeach                                                      
            </tbody>                                                                         
        </table>

【讨论】:

【参考方案3】:

我向您推荐我自己经常做的事情。您不需要制作模型,只需制作一个帮助文件并在其中编写所有自定义函数。例如,您可以在 app/Http/Helpers/ 路径中创建一个名为 helper.php 的文件。然后你必须让你的项目知道这个文件。为此,您只需将其添加到 autoload -> files 对象中的 composer.json 文件中,如下所示:

"autoload": 
    "files":[

        "app/Http/Helpers/helper.php"
    ]

在此之后只需运行命令 composer dump-autoload。现在,您可以从任何地方访问 helper.php 文件中的自定义函数。

【讨论】:

【参考方案4】:

如果状态应该包括 html,比如显示不同的颜色,我建议你使用 @include

// resources/views/statusWrapper
@if($status == 'good')
    <span style="color: green;">thats really good</span>
@else
    <span style="color: red;">not good</span>
@endif

然后在你的表格视图中

@foreach ($users as $u)
<tr>               
   <td>  $u->id </td>
   <td>  $u->name </td>
   <td>  $u->last_login </td>
   <td>
       @include('statusWrapper', ['status' => $u->status])
   </td>
</tr>              
@endforeach 

你也可以看看扩展刀片:https://laravel.com/docs/5.5/blade#extending-blade

但我不建议您将 HTML 放入您的 PHP 代码中,因为将您的 HTML 保存在您的视图文件中以供将来编辑更容易。

【讨论】:

以上是关于Laravel Blade 使用自定义函数的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Nova 中的自定义 Vue 组件

如何在priority_queue中使用函子作为自定义比较器

laravel框架 5.4自定义报错页面设置

Laravel5.4中自定义404等错误页面

Laravel Blade 指令添加额外的引号

无法使用 Laravel (blade.php) 加载具有较长链接的样式