我试图在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(...)时,一切都很完美。因为我的控制器中缺少方法的错误,我只是继续定义这些方法并将它们留空(?)。 任何帮助将不胜感激。
答案 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中的表格:
如果您想要显式命名,则必须将其注册为控制器,并使用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
- 方法应该实际持久存储(存储)新资源在数据库中。让用户获取资源:
index()
:显示用户列表create()
显示您输入凭据以创建新用户的表单(表单发布到/ user)store()
将新用户保存在数据库中(如果您按照PRG模式重定向!)show(1)
:显示ID为1的用户edit(1)
:显示一个表单,您可以在其中更改用户1的信息(表单发布到/ user / 1)update(1)
:(在Laravel中带有隐藏字段的POST请求)更新ID为1的用户(f。destroy(1)
:( Larvel中隐藏字段的POST请求)删除ID为1的用户