向laravel中的每个控制器返回相同的变量

时间:2018-09-27 09:34:15

标签: laravel eloquent laravel-controller

我需要向几乎每个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 个答案:

答案 0 :(得分: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>

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

答案 1 :(得分:1)

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

您可以使用$('.ratings_stars').hover( // Handles the mouseover function() { $(this).prevAll().addClass('ratings_over'); $(this).addClass('ratings_over'); $(this).nextAll().removeClass('ratings_vote'); }, // Handles the mouseout function() { $(this).prevAll().removeClass('ratings_over'); $(this).removeClass('ratings_over'); } ); $('.ratings_stars').click(function() { $('.ratings_stars').unbind('mouseout'); $(this).off('mouseout'); console.log('rating star clicked!') var star = this; var widget = $(this).parent(); $(this).prevAll().addClass('ratings_over'); $(this).addClass('ratings_over'); var clicked_data = { clicked_on: $(star).attr('class'), widget_id: widget.attr('id') }; }); service,也可以按照您所说的在provider内使用。

我猜想您将在代码的更多部分之间共享这一点,而不仅仅是constructor,为此,如果代码简短且集中,我将对静态调用执行controller

如果您完全确定这只是service的特例,则可以执行以下操作:

controller

最后,我仍然将您的查询放在服务或提供者下,并将其传递给控制器​​,而不是直接将其放在那里。也许还有其他值得探索的地方? :)

答案 2 :(得分:0)

@Sunil提到了View Composer Binding是实现此目的的最佳方法。

答案 3 :(得分:-1)

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

将其添加到 AppServiceProvider

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

在每个页面上访问时,每次都可以访问 drcategory location 对象 无需从每个控制器发送 drcategory 位置即可查看。

编辑您的控制器方法

public function index()
{
    return view('visitor.index');
}