Php Laravel路由不适用于post

Php Laravel路由不适用于post,php,laravel,Php,Laravel,我试图在Laravel中使用RESTful路由,但遇到了以下问题。我的页面由两个下拉列表和一个提交按钮组成。在第一次加载页面时,Controller中的show()函数将使用两个数据库查询的结果填充这两个下拉列表。 在每个下拉列表中选择一个值并点击submit按钮后,我希望页面以表格的形式显示另一个查询的结果 我的show()方法是有效的,因为下拉列表是按应该的方式填充的。我使用store()方法来处理帖子(在点击submit之后),但它会给我一个空白页面 路线: Route::resourc

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

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

路线:

 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(){}
 }
视图:

我的模型包含3个查询,2个用于下拉列表,1个用于在第二个控制器方法中调用的表。 我还想提到的是,当我使用Route::controller(…)时,一切都可以完美地工作。因为我的控制器中缺少方法,所以我继续定义这些方法,并将它们留空(?)。
因此,我非常感谢。< /P> < P>所以,我通过在Posi::On()方法的参数中添加路由名和控制器方法名来解决空白页问题。 像这样:

 {{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

任何人有任何提示吗?

资源不应该在URL中包含方法名称。当您对
/web\u tools
执行
POST
-请求时,将调用
store()
方法。如果执行
GET
,将调用
index()
。请参阅中的表格:

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

在您的
routes.php
中:

Route::controller('web_tools', 'WebController');
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(){}
 }
在您的
WebController.php
中:

Route::controller('web_tools', 'WebController');
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(){}
 }
Post/Redirect/Get模式 此外,您应该真正遵循PRG(Post/Redirect/Get)模式。在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:
    更新(1)
    :(在Laravel中带有隐藏字段的POST请求)使用id 1(f)更新用户
  • DELETE/user/1:
    destroy(1)
    :(在Larvel中带有隐藏字段的POST请求)删除ID为1的用户

您的
show
方法应接受标识符作为第一个唯一参数,即
show($id)
以识别显示的资源。我看到我一直在谈论整个资源控制器和路由错误。我没有提到我对这一点非常陌生,这是我的第一个laravel项目。如果我使用控制器路由而不是资源路由,我会在URL中获得方法名称吗?因为我的控制器都是方法是从数据库检索数据,您认为哪些HTML动词对我来说是正确的/好的做法?第一个方法,
show
将在页面初始加载时调用。第二个方法
store
用于在单击
submit
按钮后填充表。是的,您将在使用控制器路由的URL。我猜您的意思是说HTTP动词。您的两个名称,
show
store
是正确的。但是,这取决于您是更新还是插入新数据,在这种情况下,您将使用(按顺序)
更新
存储
。如果您正在进行筛选,我只需使用GET参数(
http://example.com/web_tools?filter=...
)。如果您只需将
method=“GET”放在
表单中的
-tag。是的,但如果我是你,我会重新构造。忘记使用带过滤器的
显示
方法。这仍然是
索引的职责。
显示
是指显示单个特定资源,而不是列表,即使它用过滤器缩小了范围。所有你混合在一起的东西都是r使用2/3方法(
索引
存储
显示
)实际上应该包含在
索引中
。无论如何,你为什么要使用
$\u POST
作为过滤器?这是一个坏习惯。假设你有一家网店,你的客户使用过滤器来缩小搜索范围。假设他添加了一些价格过滤器、大小和颜色。现在,他将其添加到书签中(因为他不太清楚)。下次他再次尝试查找他的搜索时,它就消失了,因为你无法为帖子请求添加书签。假设80%的客户对该搜索感兴趣。它不会在谷歌上被索引。搜索引擎优化不好。而且,从本质上讲,你仍然是
获取
产品/工具/任何东西,即使它们通过过滤器缩小了范围。所以我想说:不要把你的思想锁定在它现在掌握的逻辑上,试着敞开心扉,试着去思考