laravel创建具有不同数据的select元素

时间:2017-09-28 13:00:48

标签: php laravel

我想调用一个函数,这个函数将在我的视图中创建select option元素。例如:

{{ select_option($users, $key = 'id', $value = 'name') }}

这是我的select_option将包括html

1解决方案

MyHelper.php

function select_option($datas, $key, $value) {
    $html = '<select>';
    foreach ($datas as $data) {
        $html .= "<option key='{$data->$key}'>{$data->$value}</option>"
    }
    $html .= '</select>';

    return $html;
}

修改使用刀片模板

我知道我应该使用刀片模板,但我需要自己传递数据。我想要调用一个函数。

function select_option($datas, $key, $value) {
    return view(
            'select_option',
            ['datas' => $datas ?? []]
        )->render();
}

但我认为这很奇怪,因为我使用PHP来创建HTML元素。

2解决方案演示者

2-1将数据传递给演示者

我必须从Controller获取数据。但我想调用一个函数并立即获取数据。

@inject('SelectOption', 'App\Presenter\SelectOption')
{!!$SelectOption->getData($datas)!!}

的getData

public functin getData($datas) {
    // foreach to create select option element
    return $html
}

2-2演示者将致电服务以获取数据

我认为Presenter呼叫服务也很奇怪。我不确定渲染时间会增加。

@inject('SelectOption', 'App\Presenter\SelectOption')
{!!$SelectOption->getData()!!}

的getData

public function __construct(MyServices $my_services)
{
    $this->my_services = $my_services;
}  

public functin getData() {
    $datas = $this->my_services->getData();

    // foreach to create select option element

    return $html
}

你有什么建议吗?谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用查看分享

与所有观看次数共享数据

有时,您可能需要与应用程序呈现的所有视图共享一段数据。您可以使用view facade的share方法执行此操作。通常,您应该在服务提供程序的引导方法中进行共享调用。您可以自由地将它们添加到AppServiceProvider或生成一个单独的服务提供程序来容纳它们:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

查看作曲家

视图组合器是在呈现视图时调用的回调或类方法。如果每次渲染视图时都希望将数据绑定到视图,则视图编辑器可以帮助您将该逻辑组织到一个位置。

对于此示例,让我们在服务提供商中注册视图编辑器。我们将使用View外观来访问基础的Illuminate \ Contracts \ View \ Factory合同实现。请记住,Laravel不包含视图编辑器的默认目录。您可以随意组织它们。例如,您可以创建app / Http / ViewComposers目录:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        View::composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );

        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

价: https://laravel.com/docs/5.5/views#sharing-data-with-all-views