我想调用一个函数,这个函数将在我的视图中创建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
}
你有什么建议吗?谢谢。
答案 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