1

我需要将相同的结果发送到几乎每个view页面,因此我需要将variables每个控制器绑定并返回。

我的示例代码

public function index()
{
    $drcategory = DoctorCategory::orderBy('speciality', 'asc')->get();
    $locations = Location::get();

    return view('visitor.index', compact('drcategory','locations'));
}

public function contact()
{
    $drcategory = DoctorCategory::orderBy('speciality', 'asc')->get();
    $locations = Location::get();

    return view('visitor.contact', compact('drcategory','locations'));
}

但正如你所见,我需要一遍又一遍地编写相同的代码。如何编写一次并在需要时包含任何功能?

我考虑过使用构造函数,但我不知道如何实现它。

4

4 回答 4

5

您可以通过使用以下View::share()函数来实现此目的AppServicerProvider

App\Providers\AppServiceProvider.php:

public function __construct()
{
   use View::Share('variableName', $variableValue );
}

然后,在您的控制器中,您view照常调用:

public function myTestAction()
{
    return view('view.name.here');
}

现在您可以在视图中调用您的变量:

<p>{{ variableName }}</p>

您可以在文档中阅读更多内容。

于 2018-09-27T09:44:49.543 回答
1

有几种方法可以实现这一点。

您可以service在.providerconstructor

我猜你会在你的代码的更多部分之间共享这个,而不仅仅是这个,如果代码那么短且专注controller,我会使用静态调用。service

如果您绝对确定这只是一种特殊情况,controller那么您可以这样做:

class YourController 
{

    protected $drcategory;

    public function __construct() 
    {

       $this->drcategory = DoctorCategory::orderBy('speciality', 'asc')->get();

    }

   // Your other functions here

}

最后,我仍然会将您的查询放在 Service 或 Provider 下,并将其传递给控制器​​,而不是直接在那里。也许有一些额外的探索?:)

于 2018-09-27T09:55:14.693 回答
0

为此,您可以使用laravel 的View Composer 绑定功能

添加这是在AppServiceProvider的启动功能中

    View::composer('*', function ($view) {
                $view->with('drcategory', DoctorCategory::orderBy('speciality', 'asc')->get());
                $view->with('locations', Location::get());
            }); //please import class...

当您访问每个页面时,您每次都可以访问drcategorylocation对象,而无需发送每个控制器查看的drcategorylocation对象。

编辑你的控制器方法

public function index()
{
    return view('visitor.index');
}
于 2018-09-27T10:20:23.353 回答
0

@Sunil 提到 View Composer Binding 是实现这一目标的最佳方式。

于 2018-09-27T11:17:12.707 回答