2017-09-28 23 views
0

我想調用一個函數,並且此函數將在我的視圖上創建select option元素。例如:laravel創建具有不同數據的select元素

{{ 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通數據,以演示者

我必須從控制器獲取數據。但我想調用一個函數並立即獲取數據。

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

的getData

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

2-2主持人將調用服務來獲取數據

我認爲主持人的呼叫服務是怪異了。我不確定渲染時間會增加。

@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 
} 

你有什麼建議嗎?謝謝。

+0

您使用的刀?你可以在刀片視圖中使用@foreach –

+0

我知道我可以使用'@ foreach',但是如果我有很多'select option',我需要寫很多'@ foreach'。我想省略它。並通過自動生成'select option'創建一個獲取數據的函數。 – lighter

+0

更好的是你爲選擇創建單獨的刀片模板,包括 – iCoders

回答

0

您可以使用View份額

共享數據隨着所有視圖

有時,您可能需要使用由您的應用程序渲染的所有視圖共享一個數據。您可以使用視圖外觀的共享方法。通常情況下,您應該將呼叫置於服務提供商的啓動方法中進行共享。你可以自由地將其添加到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不包括視圖編輯器的默認目錄。無論您希望如何,您都可以自由組織它們。例如,您可以創建一個應用程序/ 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

相關問題