【问题标题】:How to pass id value from select list to controller when controller expects an object? laravel-4当控制器需要一个对象时,如何将 id 值从选择列表传递给控制器​​? laravel-4
【发布时间】:2014-08-29 10:22:48
【问题描述】:

我在仪表板视图中构建了一个选择列表,其中列出了各种组件的 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'; ... }

组件控制器:

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 而不会出错。所以,我知道这应该是涉及表单打开的简单事情,但我无法弄清楚。我怎样才能解决这个问题?谢谢!

【问题讨论】:

    标签: php forms laravel-4 controller


    【解决方案1】:

    它不会起作用,因为使用 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 请求,它会到达这条路线,您可以在这里执行您想要的功能。

    【讨论】:

    • 谢谢,但这不起作用,有几个原因。最重要的是,当我将get方法更改为post时,它会抛出一个MethodNotAllowedHttpException。除此之外,当我尝试显示通过发送 id 的 URL 发送的数据时,以前效果很好,我现在得到一个“从空值创建默认对象”异常。必须有一种简单的方法来做到这一点......
    • @flitedocnm 我已经编辑了我的回答。
    【解决方案2】:

    我终于弄清楚了问题所在,以及解决方案:

    问题是表单应该(最好)作为 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()。

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

    【讨论】:

    猜你喜欢
    • 2014-01-12
    • 2020-08-09
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2018-05-31
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多