我目前正在开发一个基于Laravel 4框架的cms.我正在尝试构建一个类似于Pyro CMS的插件系统,其中模块视图可以使用Blade模板系统包含在页面视图中.
我正在构建一个联系表单插件,如果成功提交,则会将用户重定向到给定的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');
}
}
有一个页面控制器将根据使用的路径显示相应的页面视图,并且想法是用户可以将联系表单拖放到任何页面模板中,并通过在模板视图中调用表单功能轻松地自定义它,如下所示
{{ Contact::form(array(
'to' => 'myemail@mydomain.com',
'view' => 'contact_form_1',
)) }}
除了重定向之外,这一切都很好.当表单成功提交并且发送的消息页面刷新并显示以下消息代替联系表单
HTTP/1.0 302 Found Cache-Control: no-cache Date: Tue, 17 Sep 2013 09:14:16 GMT Location: http://localhost:8888/my_initial_route Redirecting to http://localhost:8888/my_new_route.
大约2秒钟后,重定向就会发生,浏览器会重定向到用户在$params数组中提供的任何路由,如果没有提供重定向,则会重定向到当前页面,如上例所示.
任何关于它为什么这样做以及任何解决方案的建议都会很棒.
谢谢!
编辑:
以下是我采用上述方法的原因的简要概述,这可能有助于理解问题:
该项目的一个要求是,最终使用cms的开发人员可以通过单击“添加页面”按钮通过cms控制面板创建无限数量的页面.我们的想法是,我们不会为我们想要创建的每个新页面编写新的页面控制器.有了我的想法,我有以下路线:
Route::any('{page_slug}/page', array('as' => 'frontend.page', 'uses' => 'FrontendPagesController@display_page'))->where('page_slug', '[-A-Za-z0-9_-]+');
display_page功能大大缩小了:
public function display_page($slug)
{
$page = PagesModel::getPageBySlug($slug);
return View::make($page['view_name']);
}
有了这个,用户可以通过点击按钮创建一个页面,给它一个名字和一个slug,然后app可以显示该页面和相应的视图 – 在创建页面时定义 – 而不必添加任何新的路线,控制器等
在用户想要将联系表单与页面包括在一起的情况下,问题就出现了.我们如何知道他们是否会添加表单,他们将使用哪些字段以及需要进行哪些验证?我需要一种能够在任何页面中添加完全自定义的联系表单而无需开发人员触摸cms代码的方法.我对此的解决方案是上面给出的方法:开发人员将标记放入视图中并将函数传递给某些参数,这些参数可以自定义表单功能.
Contact :: form()函数有点像表单的控制器.它获取并返回包含from html的视图,处理提交并根据结果返回成功/错误消息.
现在我不一定需要使用上面的方法,但我需要一种方法将联系表单控制器与页面控制器分开,并且开发人员能够在不触及cms后端代码的情况下将表单添加到任何页面.
对此的任何想法都会很棒.
解决方法:
您应该从控制器调用重定向,而不是从视图中执行重定向.发生这种情况是因为,您已经在视图中并且它是可见的,因此如果您以某种方式使其(正文)隐藏,那么在重定向发生之前它将不可见.
但是,你做错了,反模式,IMO.使用控制器做出决定,视图应仅用于演示.这是MVC框架中的基本规则.
标签:php,laravel,view,redirect,pyrocms
来源: https://codeday.me/bug/20190728/1565703.html