Вызов метода контроллера Laravel из другого метода контроллера с перенаправлением - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть приложение Laravel 4 с базой данных списков, которые я хочу проверять каждые 30 дней.Процесс повторной проверки является довольно сложным и перенаправляется на различные блейды в зависимости от результата.До сих пор я нажимал на каждую из них вручную для повторной проверки и хочу создать пакетную функцию для проверки всех.

Вот моя рабочая функция повторной проверки (упрощенно) с новой функцией batchValidate:

public function revalidate($id=null,$batch=null)
{
    $citation = Citation::findOrFail($id);
    // Check a bunch of stuff

    if( X fails){
        return View::make('citations.manualRevalidateA');
    }
    if( Y fails){
        return View::make('citations.manualRevalidateB');
    }
    if( Z fails){
        return View::make('citations.manualRevalidateC');
    }

    if(!empty($batch) && $batch=='batch'){

        return array(
            'nap_status'=>$napcheck[0],
            'nap_details'=>$napcheck[1],
            'cache'=>$napcheck[2],
        );

    return Redirect::to('citations/')
        ->with('flash-success','Validation successful');
}

public function batchValidate()
{

    $citations = Citation::getAll();

    foreach ($citations as $citation) {
        $data=$this->revalidate($citation->id,'batch');

        // Store the result
    }

    return Redirect::to('citations/')
    ->with('flash-success','Batch validation has completed successfully.);
}

Если revalidate () обнаруживает ошибку, я хочу, чтобы цикл остановился, и управление перешло к одному из блейдов manualRevalidate.Но мой синтаксис

        return View::make('citations.manualRevalidateC');

заставляет его возвращаться к функции batchValidate со всеми сжатыми данными для представления вместо требуемого массива результатов.

Я уверен, что этопростая проблема с синтаксисом Laravel, но как идти, вызывая блейды manualRevalidate без возврата к моей пакетной функции?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Основываясь на дальнейших исследованиях, я не смог найти способ направить поток приложений так, как я хотел в Laravel.По сути, если я вызываю метод из другого метода внутри контроллера, я не могу вызвать представление, не вернувшись сначала к исходному методу, потому что Laravel использует «return» для генерации представления (т. Е. Возврата от контроллера к блейду).

Итак, мой подход состоял в том, чтобы взять всю логику, которая была в функции revalidate () в контроллере, и поместить ее в метод в модели.Затем модель возвращает результат в контроллер.Я могу вызвать метод модели из обоих методов контроллера, а затем направить оттуда к соответствующим блейдам.

0 голосов
/ 02 февраля 2019
  • Для хорошего дизайна держите имена блейдов в отдельном файле конфигурации, потому что вы можете использовать его позже в других файлах по мере роста приложения и захотите иметь единую точку управления.

  • Создайте новый файл в папке config с именем (любое имя по вашему выбору), скажем citations_manual_revalidate.php.Создайте массив, содержащий пары ключ-значение, где key - это значимое имя, которое вы хотите сохранить, а value - имя блейда.

config / citations_manual_revalidate.php:

<?php


return array(
    'manualRevalidateA' => 'citations.manualRevalidateA'
    'manualRevalidateB' => 'citations.manualRevalidateB',
    'manualRevalidateC' => 'citations.manualRevalidateC'
);
  • Поскольку ваши методы находятся в классе, у нас будет переменная экземпляра, которая будет содержать загружаемое представление, если какой-либо тест не пройден.

  • В вашем методе revalidate () мы вернем mixed значений, т. Е. Либо false, либо array().При этом мы также установим значение переменной экземпляра (которое citation_view в коде ниже) для загружаемого представления и return false.

  • Итак, таким образом, мы узнаем в нашем методе batchValidate () , какое представление необходимо загрузить в случае сбоя любого теста и вернуть их.

CitationManager.php:

<?php

use Config;

class CitationManager{
    private $citation_view;

    public function revalidate($id=null,$batch=null){
        $citation = Citation::findOrFail($id);
        // Check a bunch of stuff

        if( X fails){
            $this->citation_view = Config::get('citations_manual_revalidate.manualRevalidateA');
            return false;
        }
        if( Y fails){
            $this->citation_view = Config::get('citations_manual_revalidate.manualRevalidateB');
            return false;
        }
        if( Z fails){
            $this->citation_view = Config::get('citations_manual_revalidate.manualRevalidateC');
            return false;
        }

        $this->citation_view = ''; // reset this since there is no failure.

        if(!empty($batch) && $batch=='batch'){
            return array(
                'nap_status'=>$napcheck[0],
                'nap_details'=>$napcheck[1],
                'cache'=>$napcheck[2],
            );
        }

        return array(
            // with whatever details you want to send
        );
    }

    public function batchValidate(){

        $citations = Citation::getAll();

        foreach ($citations as $citation) {
            $data = $this->revalidate($citation->id,'batch');
            if($data === false){
                return View::make($this->citation_view);
            }else{
                // some processing
            }
        }

        return Redirect::to('citations/')
        ->with('flash-success','Batch validation has completed successfully.');
    }
}
...