当控制器期望一个对象时,如何将选择列表中的id值传递给控制器​​? laravel-4

时间:2014-07-08 15:34:34

标签: php forms laravel-4 controller

我在仪表板视图中构建了一个选择列表,其中列出了各种组件的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而没有错误。所以,我知道这应该是一个简单的涉及形式开放,但我无法弄清楚。我怎样才能解决这个问题?谢谢!

2 个答案:

答案 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()。

我知道它必须简单 - 我之前没有偶然发现解决方案:)