Php 在Laravel中将刀片文件用作小部件

Php 在Laravel中将刀片文件用作小部件,php,laravel,Php,Laravel,我遇到过这样一种情况:用户有一个主页,其中充满了他们可以通过点击添加或删除的小部件 每个小部件本质上只是存储在resources/views/widgets 一个例子: @php $widgetNo = 15; $exist = false; @endphp @hasanyrole('News Contributor|News Approver') <div class="grid-item element-item"> <section class="wid

我遇到过这样一种情况:用户有一个主页,其中充满了他们可以通过点击添加或删除的小部件

每个小部件本质上只是存储在
resources/views/widgets

一个例子:

@php 
$widgetNo = 15; 
$exist = false;
@endphp 

 @hasanyrole('News Contributor|News Approver')
<div class="grid-item element-item">
    <section class="widget" id="articles-cms">

        <div class="form-box widget light_blue">

            <div class="row header">

                <div class="col-xs-10">
                    <div class="heading">
                        <h2>News articles</h2>
                    </div>
                </div>

                <div class="col-xs-2 AddWidget">
                    @if(Route::current()->uri() == 'welcome')

                    <i class="fa fa-bars "></i>

                    @elseif(Route::current()->uri() == 'widget-library')


                    <form action="{{action('WidgetController@store')}}" method="POST">
                        @csrf
                        <input type="hidden" name="user_id" value="{{$user->id}}">
                        <input type="hidden" name="widgets" value="12">


                        <button type="submit">
                            <i class="fa fa-plus "></i>
                        </button>
                    </form>

                    @else @endif
                </div>


            </div>

            <div class="row">
                <div class="form-group col-xs-12 col-md-12">
                    <p class="info">Create and edit News and updates</p>
                    <a href="/editable/news-and-updates" class="btn btn-filled-navy btn-full-width no-margin">Click Here</a>
                </div>
            </div>
        </div>
    </section>
</div>
@endrole
有了这个,我可以利用视图中的关系

我在小部件模型中也有这两种方法

/**
* Get the user that has this Widget
*/
public function user()
{
    return $this->belongsTo(User::class, 'user_id', 'id');
}

/**
 * Check whether a given user has this Widget
 */
public function getIsSelected()
{
    $selected = $this->user()->whereUserId(Auth::user()->id)->first();

    return (!is_null($selected)) ? true : false;
}
这样我就可以检查用户是否选择了小部件

目前,在我的主页上,我只有一个switch语句

@foreach ($user->widgets as $widget) 

    @switch($widget->widget_id) 

        @case (1) 
            @include('widgets.quick-search-full-width') 
            @break; 
        @case(2) 
            @include('widgets.calendar') 
            @break; 
        @case (3) 
            @include('widgets.suggestion') 
            @break; 
        @case (4) 
            @include('widgets.task')
            @break; 
        @case (5) 
            @include('widgets.quick-search') 
            @break; 
        @case (6) 
            @include('widgets.message')
            @break; 
        @case(7) 
            @include('widgets.find-expert') 
            @break; 
        @case (8) 
            @include('widgets.holiday') 
            @break; 
        @case (9) 
            @include('widgets.expenses')
            @break; 
        @case (10) 
            @include('widgets.snap-pole') 
            @break; 
        @case (11) 
            @include('widgets.teams-cms') 
            @break; 
        @case (12)
            @include('widgets.events-cms') 
            @break; 
        @case (13) 
            @include('widgets.team-cms') 
            @break;  
        @case (14) 
            @include('widgets.article-todo') 
            @break; 
        @case (15) 
            @include('widgets.article-cms') 
            @break; 
        @case (16) 
            @include('widgets.vacancies') 
            @break;
        @case(17) 
            @include('widgets.yammer') 
            @break; 
        @default
        <h3>You currently have no widgets</h3>
    @endswitch 

@endforeach
@foreach($user->widgets作为$widget)
@开关($widget->widget\u id)
@案例(1)
@包括('widgets.quick search full width')
@中断;
@案例(2)
@包括('widgets.calendar')
@中断;
@案例(3)
@包括('widgets.suggestion')
@中断;
@案例(4)
@包括('widgets.task')
@中断;
@案件(5)
@包括('widgets.quick search')
@中断;
@案件(6)
@包括('widgets.message')
@中断;
@案件(7)
@包括('widgets.find expert')
@中断;
@案件(8)
@包括('widgets.holiday')
@中断;
@案件(9)
@包括('widgets.expenses')
@中断;
@案件(10)
@包括('widgets.snap pole')
@中断;
@案件(11)
@包括('widgets.teams cms')
@中断;
@案件(12)
@包括('widgets.events cms')
@中断;
@案件(13)
@包括('widgets.team cms')
@中断;
@案件(14)
@包括('widgets.article todo')
@中断;
@案件(15)
@包括('widgets.article cms')
@中断;
@案件(16)
@包括('widgets.expansions')
@中断;
@案件(17)
@包括('widgets.yammer')
@中断;
@违约
您当前没有小部件
@终端开关
@endforeach

我的问题是,有没有更好的方法拉入或使用这些小部件,因为目前很明显,小部件的显示完全取决于使用vanilla PHP的小部件中是否有ID。

您可以在数据库中有blade_name字段,因此在这种形式下,例如,您在该小部件的记录中有“calendar”。 因此,您可以像这样添加小部件

@foreach ($user->widgets as $widget) 
@include('widgets.'.$widget->blade_name)
@endforeach

使用这种方法,您会使用单个窗口小部件表还是只将刀片名称添加为一个额外字段?作为窗口小部件表中其他fieldsHow旁边的一个额外字段,您会以编程方式添加刀片名称吗?现在我得到了您的问题,我想,您应该有一个表,其中包含具有字段刀片名称的窗口小部件,你的widget_id指的是什么?这仅仅是硬编码吗?我将小部件ID硬编码到每个HTML块中,但是这种方法似乎有点松散
@foreach ($user->widgets as $widget) 
@include('widgets.'.$widget->blade_name)
@endforeach