Знаете ли вы, как правильно переместить этот код из представления в контроллер? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть этот код ниже, чтобы показать сводку регистрации, например:

Registration type        Quantity            Price           Subtotal
general                     1                0.00             0.00
plus                        2                2.00             4.00

Код в представлении, чтобы показать сводку:

<ul>
    <li>
        <span>Registration Type</span>
        <span>Quantity</span>
        <span >Price</span>
        <span>Subtotal</span>
    </li>

    <?php
    $total = 0;
    $type_counts = [];
    foreach ($registrationTypeDetails->participants as $p) {
        $name = $p->registration_type->name;
        if (!isset($type_counts[$name])) {
            $type_counts[$name] = 0;
        }
        $type_counts[$name]++;
    }
    ?>
    @foreach($registrationTypeDetails->participants as $participant)
        @php ($name = $participant->registration_type->name)
        @php ($total +=$participant->registration_type->price * $type_counts[$name])
        <li>
            <span>{{$name}}</span>
            <span>{{$type_counts[$name]}}</span>
            <span>{{ number_format($participant->registration_type->price, 2)}}$</span>
            <span>{{ number_format($participant->registration_type->price * $type_counts[$name], 2)}}$</span>
        </li>
    @endforeach
    <li>
        <span>TOTAL</span>
        <span>{{ number_format($total, 2)}}€</span>
    </li>
</ul>

Работаетхорошо, но я хочу передать приведенный выше код php, который находится в представлении, в метод контроллера showSummary (), а затем вернуться к представлению необходимых данных для отображения сводки, но я не добился успеха в достижении этого.

Знаете ли вы, как этого можно добиться надлежащим образом?

У меня в контроллере есть метод showSummary(), который возвращает "registrationTypeDetails" в представлении выше.

public function showSummary($id, $slug, $regID)
    {
        $registrationTypeDetails = Registration::with(['participants.registration_type',
            'participants' => function ($query) use ($regID) {
                $query->select('id', 'registration_type_id', 'registration_id')->where('registration_id', $regID);
            }
        ])->find($regID);

        return view('conferences.showSummary', compact('registrationTypeDetails', 'id', 'slug'));
    }

То, что я сделал для достижения этой цели, поместило в контроллер часть для подсчета количества каждого типа регистрации, например:

public function payment($id, $slug, $regID)
    {
        $registrationTypeDetails = Registration::with(['participants.registration_type',
            'participants' => function ($query) use ($regID) {
                $query->select('id', 'registration_type_id', 'registration_id')->where('registration_id', $regID);
            }
        ])->find($regID);

        $type_counts = [];
        foreach ($registrationTypeDetails->participants as $p) {
            $name = $p->registration_type->name;
            if (!isset($type_counts[$name])) {
                $type_counts[$name] = 0;
            }
            $type_counts[$name]++;
        }

        $registrationTypes = [];

        return view('conferences.payment', compact( 'type_counts', 'registrationTypeDetails', 'id', 'slug'));
    }

И в представлении просто:

<ul>
    <li>
        <span>Registration Type</span>
        <span>Quantity</span>
        <span>Price</span>
        <span>Subtotal</span>
    </li>
    <?php
    $total = 0;
    ?>
    @foreach($registrationTypeDetails->participants as $participant)
        @php ($name = $participant->registration_type->name)
        @php ($total +=$participant->registration_type->price * $type_counts[$name])
        <li>
            <span>{{$name}}</span>
            <span>{{$type_counts[$name]}}</span>
            <span>{{ number_format($participant->registration_type->price, 2)}}
                €</span>
            <span>{{ number_format($participant->registration_type->price * $type_counts[$name], 2)}}
                €</span>
        </li>
    @endforeach
    <li>
        <span>TOTAL</span>
        <span>{{ number_format($total, 2)}}€</span>
    </li>
</ul>

Но яне знаю, если это нормально, если есть еще код, который должен идти к контроллеру.Потому что мне нужно хранить в сеансе общее значение регистрации ($total), но общее значение ($ total) отображается не в контроллере, который не кажется правильным.

1 Ответ

0 голосов
/ 11 июня 2018

Ответ - нет.

Контроллер предназначен для передачи данных из одного места в другое, а представление - для отображения данных.Хорошее правило заключается в том, что если вы пишете PHP и создаете массивы в шаблоне Blade, вы делаете слишком много (что, как вам кажется, вам известно).

Создайте себе папку с именем repositories в вашем приложении и создайте RegistrationRepository или что-то подобное.Создайте свой стол как Коллекция - или получите его от Eloquent более эффективным способом.Затем используйте Коллекция map(), чтобы создать общее количество.Передайте эти данные в представление, а затем просто зациклите их и отобразите их.

Сохраняйте ваши модели и контроллеры легкими, создавайте новые классы для сохранения сложной логики. Есть также аргумент, что это можно сделать как View Composer , но я думаю, что когда вы создаете дополнительную информацию и читаете из нескольких мест, создание хранилища для нее является самым чистым.

Однако этомнение, а не ответ.К сожалению, нет однозначного ответа, поскольку MVC - это то, что вы хотите, чтобы это было на самом деле.Rails любит тяжелые модели, CodeIgniter - тяжелые контроллеры. Лично Я полагаю, что Laravel хочет иметь контроллеры освещения и модели освещения - но решать вам, если вы согласны, решать вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...