我在仪表板视图中构建了一个选择列表,其中列出了各种组件的ID和名称。数据被传递给控制器,该控制器使用传递的id生成视图,以获取该id的正确组件数据。问题是控制器被构造为期望从中获取id的对象,因此当我从列表中提交id时,我得到“试图获取非对象的属性”错误。 (无论我是提交路线还是直接提交给控制器都没关系;我得到同样的错误。)这是代码:
PagesController(为仪表板创建列表数组):
public function showDashboard()
{
$components = Component::lists('name','id');
return View::make('dashboard', array(
'components'=>$components, ...
));
}
选择列表的源代码片段:
<form method="GET" action="https://..." accept-charset="UTF-8">
<select id="id" name="id"><option value="2">Component Name</option>...
组件型号:
class Component extends Eloquent {
protected $table = 'components'; ... }
ComponentsController:
public function show($id)
{
$component = $this->component->find($id);
return View::make('components.show', array(
'component'=>$component, ...
));
}
dashboard.blade.php:
{{ Form::open(array(
'action' => 'ComponentsController@show',
'method'=>'get'
)) }}
{{ Form::Label('id','Component:') }}
{{ Form::select('id', $components) }}
{{ Form::close() }}
相同的控制器代码用于其他目的并且工作正常,例如,当我从URL传递特定的id时,它接受该id而没有错误。所以,我知道这应该是一个简单的涉及形式开放,但我无法弄清楚。我怎样才能解决这个问题?谢谢!
答案 0 :(得分:0)
它不起作用,因为使用 get方法,url就是这样。
http://laravel/puvblic/show?id=2
并且laravel不会接受它,而是以这种方式接受函数的参数
http:/laravel/puvblic/show/2
更好的方法是将表单方法设为'POST'。这样会更安全,更好。并将您的功能修改为。
public function show()
然后,您可以在控制器中获取ID
Input::get('id')
编辑:
为简单起见,试试这个:
Route::get('{show?}', function()
{
$id = Input::get('id') ;
echo $id; //This will give you the id send via GET
die();
});
只需按照 GET方法,您的表单就会发送一个GET请求,它将来到此路线,您可以执行所需的功能。
答案 1 :(得分:0)
我终于找到了问题和解决方案:
问题是表单应该(最佳地)作为POST(而不是GET)发送,因此不会从Blade提供的默认值更改。然后,路线必须正确注册为POST,这就是我之前没有做过的事情。所以,
dashboard.blade.php:
{{ Form::model(null, array('route' => array('lookupsociety'))) }}
{{ Form::select('value', $societies) }} ...
路线:
Route::post('lookupsociety', array('as'=>'lookup society', 'uses'=>'SocietiesController@lookupsociety'));
SocietiesController @ lookupsociety:
public function lookupsociety()
{
$id = Input::get('value'); ... // proceed to do whatever is needed with $id value passed from the select list
}
完美无缺!关键是改变路由中的方法到Route :: post()而不是Route :: get()。
我知道它必须简单 - 我之前没有偶然发现解决方案:)