Php Laravel-从视图中调用Redirect::to()

Php Laravel-从视图中调用Redirect::to(),php,redirect,view,laravel,pyrocms,Php,Redirect,View,Laravel,Pyrocms,我目前正在开发基于Laravel4框架的cms。我正在尝试构建一个插件系统,类似于Pyro CMS,其中模块视图可以使用刀片模板系统包含在页面视图中 我正在构建一个联系人表单插件,如果提交成功,它会将用户重定向到给定的url,或者直接重定向回现有页面 我的联系人表单类的代码是: class Contact { public static function form($params) { //get params and execute relevant logic here

我目前正在开发基于Laravel4框架的cms。我正在尝试构建一个插件系统,类似于Pyro CMS,其中模块视图可以使用刀片模板系统包含在页面视图中

我正在构建一个联系人表单插件,如果提交成功,它会将用户重定向到给定的url,或者直接重定向回现有页面

我的联系人表单类的代码是:

class Contact {

public static function form($params)
{
    //get params and execute relevant logic here

    $redirect = isset($params['redirect']) ? $params['redirect'] : Request::url();

    $data = Input::all();

    if($data)
    {
        // Run validation and send message here
        return Redirect::to($redirect)
    }

    return View::make('contact_form_view');
}

}
有一个页面控制器,它将根据所使用的路线显示适当的页面视图,其思想是用户可以将联系人表单放入任何页面模板中,并通过在模板视图中调用表单功能轻松定制,如下所示

<html>
    <head>
    </head>
    <body>

        {{ Contact::form(array(

            'to' => 'myemail@mydomain.com',
            'view'  => 'contact_form_1',

        )) }}

    </body>
</html>
大约2秒钟后,重定向发生,浏览器被重定向到用户在$params数组中提供的任何路由,或者如果未提供重定向,则被重定向到当前页面,如上例所示

任何关于它为什么这样做的建议,以及任何解决方案,都是非常好的

谢谢


编辑:

以下是我为什么采用上述方法的简要概述,这可能有助于理解问题:

该项目的一个要求是,最终将使用cms的开发人员可以通过点击“添加页面”按钮,通过cms控制面板创建无限数量的页面。我们的想法是,我们并不是为我们想要创建的每个新页面都编写新的页面控制器。有了这一点,我想到了以下路线:

Route::any('{page_slug}/page', array('as' => 'frontend.page', 'uses' => 'FrontendPagesController@display_page'))->where('page_slug',  '[-A-Za-z0-9_-]+');
大大缩小的
显示页面
功能是:

public function display_page($slug)
{
    $page = PagesModel::getPageBySlug($slug);
    return View::make($page['view_name']);
}
有了它,用户只需点击一个按钮就可以创建一个页面,给它一个名称和一个slug,然后应用程序就可以显示该页面和相应的视图——在创建页面时定义——而无需添加任何新的路由、控制器等

当用户希望在页面中包含联系人表单时,问题就会出现。我们如何知道他们是否会添加表单,他们将使用哪些字段以及需要哪些验证?我需要一种方法,能够添加一个完全自定义的联系方式到任何页面,而不必开发人员触摸cms代码。我的解决方案是上面给出的方法:开发人员将标记放到视图中,并向函数传递一些参数,这些参数自定义表单功能

Contact::form()
函数有点像表单的控制器。它获取并返回包含来自html的提交的视图,处理提交并根据结果返回成功/错误消息

现在,我不一定需要使用上述方法,但我需要一种将联系人表单控制器与页面控制器分离的方法,使开发人员能够在不接触cms后端代码的情况下向任何页面添加表单


关于这方面的任何想法都很好。

当您在视图中调用函数时,它应该返回HTML,然后显示。例如,当您调用
{{Url::to('foo')}}
时,它会生成

当您调用
{{Contact::form(…)}}
时,它应该输出HTML。返回
View::make(…)
时,返回的是HTML。当您返回
Redirect::to(…)
时,您返回的是一个Laravel对象,Laravel路由器将其解析为重定向头


重定向几乎必须由路由对象或控制器调用。如果您的表单提交由控制器处理,请将重定向放在那里。

您应该从控制器调用
重定向,而不是从视图调用。发生这种情况是因为,您已经在视图中并且它是可见的,所以如果您能够以某种方式将它(身体)隐藏起来,那么在重定向发生之前它将不可见


但是,您这样做是错误的,
反模式
,IMO。请使用控制器进行决策,视图应仅用于演示。这是一个
MVC
框架中非常基本的规则。

刚刚遇到了同样的问题,降级为“4.0.*”,并且得到了修复

看起来这是一个4.1.x的问题

降级步骤

将composer.json更改为:

"require": {
    ...
    "laravel/framework": "4.0.x",
    ...
}
编辑app.php-“控制器”别名

'Controller'      => 'Illuminate\Routing\Controller',
应该成为

'Controller'      => 'Illuminate\Routing\Controllers\Controller',
我不得不删除那些服务提供商

'Illuminate\Remote\RemoteServiceProvider',
'Illuminate\Exception\LiveServiceProvider',
编辑:

我在Github上打开了一个关于此的问题,并且早些时候Taylor修复了它。做一个作曲家更新,你应该很好。

简单的方法:

header('Location: '.route('clients.create'));

联系人表格是否已提交给控制员?能否显示处理表单提交的控制器代码?您应该在控制器上重定向,而不是在视图上重定向,因为view::make()将在重定向之前输出一些内容。。我认为在重定向之前隐藏是一个坏主意,也是一种资源浪费。。OP应该把重定向放在控制器上..没问题。我只是担心OP可能会走这条路,如果他/她不这么做的话,这条路应该会省去很多麻烦谢谢你的回复。我明白我所采取的方法无论如何都不是最佳实践;然而,这是我面临的一个更普遍问题的解决方案,即将联系人从控制器与页面控制器分离。如果你有什么想法的话,我已经在我原来的帖子上做了一些扩展,以提供更多的见解?
header('Location: '.route('clients.create'));