Laravel Routing不适用于帖子

时间:2015-01-14 10:24:48

标签: php laravel

我试图在Laravel中使用RESTful路由,但我遇到了以下问题。我的页面包含2个下拉列表和一个提交按钮。在第一次加载页面时,Controller中的show()函数会使用2个数据库查询的结果填充两个下拉列表。 在我在每个下拉列表中选择一个值并点击提交按钮后,我希望该页面将另一个查询的结果显示为表格。

我的show()方法有效,因为下拉列表按其应有的方式填充。我使用store()方法来处理帖子(在点击提交后),但它给了我一个空白页面。

路线:

 Route::resource('web_tools', 'WebController');

控制器:

 class WebController extends BaseController {
       public function show() {
              $filters = WebToolsPage::QueryFilters();
              $category = WebToolsPage::QueryCategory(); 

              return View::make('top_pages.table',
              ['Filter'=>$filters, 'Category'=>$category]);
       }

       public function store() {
              $filt = Input::get('filt');
              $cat  = Input::get('cat');
              $filters = WebToolsPage::QueryFilters(); 
              $category = WebToolsPage::QueryCategory();
              $query = WebToolsPage::QueryTable($filt, $kat);
              return View::make('top_pages.table',
              ['Webmasters'=>$query,'Filter'=>$filters, 'Category'=>$category]);
       }

       public function index(){}
       public function create(){}
 }

查看:

 {{Form::open()}}

 {{ Form::select('filt', $Filter) }}  
 {{ Form::select('kat', $Kategorie) }}

 {{ Form::Submit('Filter') }}

 ......

 {{Form::close()}}

我的模型包含3个查询,2个用于下拉列表,1个用于在第二个控制器方法中调用的表。 我还想提一下,当我使用Route :: controller(...)时,一切都很完美。因为我的控制器中缺少方法的错误,我只是继续定义这些方法并将它们留空(?)。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

所以我通过将POST后要调用的路由名称和控制器方法名称添加到Form :: open()方法的参数来解决空白页面问题。

像这样:

 {{Form::open(['route' => 'web_tools.store'])}}

 {{ Form::select('filt', $Filter) }}  
 {{ Form::select('kat', $Kategorie) }}

 {{ Form::Submit('Filter') }}

 ......

 {{Form::close()}}

现在我能够看到该表,但唯一的问题是URI现在不包含操作名称。

我想:

 .../web_tools/store

但现在有:

 .../web_tools

任何有任何提示的人?

答案 1 :(得分:0)

资源不应该在URL中包含方法名称。当您对POST执行/web_tools - 请求时,会调用store()方法。如果您执行GET,则会调用index()。请参阅Laravel documentation中的表格: Resourceful controllers

显式路由命名

如果您想要显式命名,则必须将其注册为控制器,并使用RESTful方法命名模式:

routes.php

Route::controller('web_tools', 'WebController');

和您的WebController.php

class WebController extends BaseController {
       public function getShow() {
              $filters = WebToolsPage::QueryFilters();
              $category = WebToolsPage::QueryCategory(); 

              return View::make('top_pages.table',
              ['Filter'=>$filters, 'Category'=>$category]);
       }

       public function postStore() {
              $filt = Input::get('filt');
              $cat  = Input::get('cat');
              $filters = WebToolsPage::QueryFilters(); 
              $category = WebToolsPage::QueryCategory();
              $query = WebToolsPage::QueryTable($filt, $kat);
              return View::make('top_pages.table',
              ['Webmasters'=>$query,'Filter'=>$filters, 'Category'=>$category]);
       }

       public function getIndex(){}
       public function getCreate(){}
 }

发布/重定向/获取模式

此外,您应该遵循PRG(发布/重定向/获取)模式。在store()方法中,您实际想要做的是:

       public function store() {
              $filt = Input::get('filt');
              $cat  = Input::get('cat');
             //Store whatever you want to store
              return Redirect::action(self::class."@index");
       }

一般资源路由

首先,我认为你误解了资源丰富的控制器和路由。它们用于资源(即数据库中表示的内容;用户,帖子,评论等),因此store - 方法应该实际持久存储(存储)新资源在数据库中。让用户获取资源:

  • GET / user: index():显示用户列表
  • GET / user / create: create()显示您输入凭据以创建新用户的表单(表单发布到/ user)
  • POST / user: store()将新用户保存在数据库中(如果您按照PRG模式重定向!)
  • GET / user / 1: show(1):显示ID为1的用户
  • GET / user / 1 / edit: edit(1):显示一个表单,您可以在其中更改用户1的信息(表单发布到/ user / 1)
  • PUT / user / 1: update(1) :(在Laravel中带有隐藏字段的POST请求)更新ID为1的用户(f。
  • DELETE / user / 1: destroy(1) :( Larvel中隐藏字段的POST请求)删除ID为1的用户