Laravel: передача динамической переменной через подвиды - PullRequest
0 голосов
/ 15 мая 2018

Я использую Laravel 5.1 и мне нужно передать динамический счетчик в подвью от основного вида. В каждом вложенном виде следует использовать значение счетчика из предыдущего вложенного представления. Но проблема в том, что каждый суб-вид инициализирует счетчик с самого начала. Я использую View Composer для запуска счетчика:

class PDFComposer
{

    public function compose(View $view)
    {
        $view->with('pdfCount', 0);
    }
}

Затем свяжите его с представлением в моем поставщике услуг:

public function boot()
{
    view()->composer('summary', PDFComposer::class);
}

Тогда у меня есть сводный вид с 4 ответами:

@include('answer', ['answers' => $group0])
@include('answer', ['answers' => $group1])
@include('answer', ['answers' => $group2])
@include('answer', ['answers' => $group3])

Каждый подвид обновляет счетчик по одному на основе некоторых критериев. Я хочу, чтобы в следующем под-представлении 'answer' использовалось последнее значение счетчика из предыдущего под-представления 'answer' Но каждое представление использует «0» в качестве начального значения.

1 Ответ

0 голосов
/ 16 мая 2018

Нашел решение сам. Представления Laravel не предназначены для изменения переменных (разделение логического представления). Таким образом, по умолчанию все вложенные представления всегда получают начальное значение в изолированной области видимости. Мое решение состоит в том, чтобы связать представление композитора с самим представлением и обновить значение в двунаправленном режиме:

  • ссылка компоновщика на вложенные представления, а не на основное представление в ServiceProvider (1 *)
  • обновить представление композитора, чтобы использовать не фиксированное начальное значение, но получить значение
    от просмотра общих данных (2 *)
  • изменить подвид для обновления переменной в конце рендеринга (3 *)

.

public function boot()
{
    view()->composer('answer', PDFComposer::class); // 1*
}

.

namespace App\Views\Composers;

use Illuminate\View\View;

class PDFComposer
{

    private $view;

    public function compose(View $view)
    {
        $this->setView($view);
        $this->view->with('pdfCount', $this->shared('pdfCount', 0)); // 2*
    }

    private function setView(View $view)
    {
        $this->view = $view;
    }

    private function shared($key, $default = null)
    {
        $sharedData = $this->view->getFactory()->getShared();
        return (isset($sharedData[$key]) ? $sharedData[$key] : $default);
    }
}

.

{{ some_blade_code_here }}
<?php view()->share('pdfCount', $pdfCount); /* 3* */ ?>
...