我有一个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
答案 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
值,即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.');
}
}
答案 1 :(得分:0)
基于进一步的研究,我无法找到任何在Laravel中路由应用程序流的方法。本质上,如果我从控制器内部的另一个方法调用一个方法,则必须先返回原始方法才能调用视图,因为Laravel使用“返回”来生成视图(即,从控制器返回到刀片)。 / p>
因此,我的方法是采用控制器中revalidate()函数中的所有逻辑,并将其放入模型中的方法中。然后,模型将结果返回给控制器。我可以从两个控制器方法中调用模型方法,然后从那里路由到适当的刀片。