使用重定向从另一个控制器方法调用Laravel控制器方法

时间:2019-02-01 19:40:13

标签: laravel redirect controller

我有一个Laravel 4应用,该应用包含我要每30天重新验证一次的列表数据库。重新验证过程相当复杂,并且根据结果重定向到各种刀片。到目前为止,我一直在手动单击每个按钮以进行重新验证,并且我想创建一个批处理功能来对所有模块进行验证。

这是我正在使用的revalidate函数(已简化),带有新的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语法问题,但是如何调用而不返回到批处理功能的manual 刀片?

2 个答案:

答案 0 :(得分:0)

  • 为获得良好的设计,请将刀片服务器名称保存在单独的配置文件中,因为随着应用程序的增长,您以后可能会在其他文件中使用刀片服务器名称,并且您希望进行单点管理。

  • config文件夹中以名称(您选择的任何名称),例如citations_manual_revalidate.php新建文件。制作一个包含键值对的数组,其中key是您要保留的有意义的名称,value是刀片名称。

<强>配置/ citations_manual_revalidate.php:

<?php


return array(
    'manualRevalidateA' => 'citations.manualRevalidateA'
    'manualRevalidateB' => 'citations.manualRevalidateB',
    'manualRevalidateC' => 'citations.manualRevalidateC'
);
  • 由于您的方法在类中,因此如果有任何测试失败,我们将拥有一个实例变量,该变量将保存要加载的视图。

  • 在您的 revalidate()方法中,我们将返回mixed值,即falsearray()。这样做时,我们还将实例变量的值(在下面的代码中为 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.');
    }
}

答案 1 :(得分:0)

基于进一步的研究,我无法找到任何在Laravel中路由应用程序流的方法。本质上,如果我从控制器内部的另一个方法调用一个方法,则必须先返回原始方法才能调用视图,因为Laravel使用“返回”来生成视图(即,从控制器返回到刀片)。 / p>

因此,我的方法是采用控制器中revalidate()函数中的所有逻辑,并将其放入模型中的方法中。然后,模型将结果返回给控制器。我可以从两个控制器方法中调用模型方法,然后从那里路由到适当的刀片。