Laravel从私有方法重定向有错误

时间:2015-05-28 09:24:22

标签: php laravel redirect if-statement laravel-5

我有以下代码:

public function store(Request $request)
{
        $this->validateData($request->all());

        // store something

        return redirect()->action('controller@index')->withMessage( 'Saved Successfully' );
}

private function validateData($requestParams)
{
    try 
    {
        $validator->validate( $requestParams );
    } 
    catch ( ValidationException $e ) 
    {
        redirect()->action('controller@create')->withInput()->withErrors( $e->get_errors() )->send();
        exit(); // this causes the withErrors to not be there
    }
}

如果删除exit();,将显示错误消息,但也会执行存储功能(请参阅// store something)。我知道我可以改写我的代码:

if($this->validateData($request->all()))
{
    // store something

    return redirect()->action('controller@index')->withMessage( 'Saved Successfully' );
}

但我不想在这里发表丑陋的if声明。必须有一种方法可以在没有闪存消息的情况下重定向。

3 个答案:

答案 0 :(得分:5)

TL;博士

更新您的私有方法代码,以使重定向与$errors变量可见:

private function validateData($requestParams)
{
    try 
    {
        $validator->validate( $requestParams );
    } 
    catch ( ValidationException $e ) 
    {
        $resp = redirect()->action('WelcomeController@index')->withInput()->withErrors($e->get_errors());
        \Session::driver()->save();
        $resp->send();
        exit();
    }
}

的解释

当退出控制器中间时,在应用程序终止中执行的某些作业将不再执行。在您的情况下,将不会调用会话中间件terminate方法。让我们看看它的内容(ref):

public function terminate($request, $response)
{
    if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions())
    {
        $this->manager->driver()->save();
    }
}

现在,查看Session驱动程序的save方法(ref

public function save()
{
    $this->addBagDataToSession();
    $this->ageFlashData();
    $this->handler->write($this->getId(), $this->prepareForStorage(serialize($this->attributes)));
    $this->started = false;
}

如您所见,只有在Session中间件成功终止时才会保存您的Flash数据。使用旧代码,闪存数据将丢失!

我的代码操作是在将响应发送到浏览器之前手动调用save方法。但是,我仍然建议您将重定向带到公共控制器方法。

答案 1 :(得分:0)

我在那里使用if语句没有看到任何问题。基本上你不会停止代码执行,这就是执行商店功能的原因,即使你的验证失败了。重定向功能只是发送一个带有重定向位置的头,它不会在执行后中止代码。它适用于exit(),因为它会发送重定向标头并停止执行其余代码。

这不丑,它干净清晰,我建议你使用它。这是正确if语句使用的一个很好的例子 - 如果遇到一个条件,那么就这样做。在您的情况下,如果您的验证通过,只需存储该对象。 (只需记住修改验证函数以返回true或false)

if($this->validateData($request->all()))
{
    // store something

    return redirect()->action('controller@index')->withMessage( 'Saved Successfully' );
}

另一种可能的解决方案是像这样使用try .. catch

public function store(Request $request)
{
    try {
        $this->validateData($request->all());

        // store something

        return redirect()->action('controller@index')->withMessage( 'Saved Successfully' );
    } catch ( ValidationException $e ) {
        return redirect()->action('controller@create')->withInput()->withErrors( $e->get_errors() );
    }
}

private function validateData($requestParams)
{
    // Your validation logic here
    $validator->validate( $requestParams );
}

答案 2 :(得分:-1)

你只是忘了回归'在验证例外之后:D,那么你就不必退出;'