Cách lấy giá trị biểu mẫu trong bộ điều khiển Symfony2


81

Tôi đang sử dụng biểu mẫu đăng nhập trên Symfony2 với mã điều khiển sau

public function loginAction(Request $request)
{
    $user = new SiteUser();
    $form = $this->createForm(new LoginType(), $user);


    if ($request->getMethod() == 'POST') {
        $form->bindRequest($request);
        $data = $form->getValues();
        // Need to do something with the data here
    }

    return $this->render('GDSiteBundle::header.html.twig', array('form' => $form->createView()));
}

Nhưng tôi nhận được cảnh báo sau:

Cảnh báo: array_replace_recursive () [function.array-Replace-recursive]: Đối số # 1 không phải là một mảng trong \ nhà cung cấp \ symfony \ src \ Symfony \ Component \ Form \ Form.php dòng 593 500 Lỗi máy chủ nội bộ - Lỗi ngoại lệ

Ai đó có thể giúp tôi hiểu điều gì không chính xác và tôi có thể sửa nó như thế nào? Cảm ơn.

Cập nhật: Tệp cành cây giống như sau:

<div class="form">
    {{ form_errors(form) }}
    <form action="{{ path('site_user_login') }}" method="POST" {{ form_enctype(form) }}>
        <div class="level1">
            {{ form_row(form.username) }}
            <a href="javascript:void(0)" id="inscription">{% trans %}Registration{% endtrans %}</a>
        </div>
        <div class="level2">
            {{ form_row(form.pwd_hash) }}
            <div class="forget_pass"><a href="#" id="frgt">{% trans %}Forgot Password ?{% endtrans %}</a></div>
        </div>
        <input type="submit" class="submit" name="login" value/>
        <div class="clr"></div>
    </form>
</div>

Đây là hàm trong Loại của Biểu mẫu

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('username', 'text', array('label' => 'Username : '));
    $builder->add('pwd_hash','password', array('label' => 'Password : '));
}

Đây là tuyến đường:

site_user_login:
    pattern: /{_locale}/login
    defaults: {_controller: GDSiteBundle:SiteUser:login}

Câu trả lời:


99

Đơn giản :

$data = $form->getData();

1
Câu trả lời hay - RE: câu trả lời bên dưới. Symfony thường cho phép thực hiện nhiều cách để có kết quả tương tự. Việc nghiên cứu "Các phương pháp hay nhất" khi tìm kiếm các giải pháp SF luôn luôn tốt.
JustinP 12/12/12

8
Đối với phiên bản mới: $ data = $ form-> all ();
Gmajoulet

92

Không có điều nào ở trên phù hợp với tôi. Điều này phù hợp với tôi:

$username = $form["username"]->getData();
$password = $form["password"]->getData();

Tôi hy vọng nó sẽ giúp.


2
Hmmm lạ, tôi đã hiểu nó hoạt động với $ request-> request-> get ('tên người dùng'); Bạn đã chuyển đối tượng yêu cầu làm tham số cho hành động chưa? Và bạn cũng cần phải bao gồm Lớp Yêu cầu trong phần trên.
VishwaKumar

59

Trong Symfony 2 (cụ thể hơn là phiên bản 2.3), bạn có thể lấy dữ liệu của một trường bằng cách

$var = $form->get('yourformfieldname')->getData();

hoặc bạn có thể nhận được tất cả dữ liệu được gửi

$data = $form->getData();

trong đó '$ data' là một mảng chứa các giá trị của trường biểu mẫu của bạn.


20

Trong Symfony> = 2.3, bạn có thể nhận giá trị của các trường đơn lẻ với:

$var = $form->get('yourformfieldname')->getData();

Mặt khác, bạn có thể sử dụng:

$data = $form->getData();

NHƯNG điều này sẽ giúp bạn có được hai điều khác nhau:

  • thực thể có các giá trị được biểu mẫu điền vào, nếu biểu mẫu của bạn có data-classtùy chọn được bật (vì vậy nó được liên kết với một thực thể); điều này sẽ loại trừ bất kỳ trường nào có 'mapping' => falsetùy chọn

  • nếu không, một mảng với tất cả các trường của biểu mẫu


18

Nếu bạn có các trường bổ sung trong biểu mẫu không được xác định trong Thực thể, $form->getData()không hoạt động, một cách có thể là:

$request->get("form")["foo"] 

Hoặc là :

$form->get('foo')->getData();

Cảm ơn bạn! Bạn đã cứu ngày của tôi!

Cảm ơn bạn! Điều này đã giúp rất nhiều.
madshvero

nếu bạn cần id của truy vấn nếu nó là một đối tượng, bạn có thể thực hiện lệnh sau: $ form-> get ('foo') -> getData () -> getId ();
juanitourquiza

Thực sự đánh giá cao câu trả lời của bạn, nó thực sự hữu ích.
Ivan Franco

5

Trong các biểu mẫu Symfony , có hai loại máy biến áp khác nhau và ba loại dữ liệu cơ bản khác nhau: nhập mô tả hình ảnh ở đây Ở bất kỳ dạng nào, ba loại dữ liệu khác nhau là:

  • Dữ liệu mô hình

    Đây là dữ liệu ở định dạng được sử dụng trong ứng dụng của bạn (ví dụ: đối tượng Sự cố). Nếu bạn gọi Form::getData()hoặc Form::setData(), bạn đang xử lý dữ liệu "mô hình".

  • Dữ liệu định mức

    Đây là phiên bản chuẩn hóa dữ liệu của bạn và thường giống với dữ liệu "mô hình" của bạn (mặc dù không có trong ví dụ của chúng tôi). Nó không thường được sử dụng trực tiếp.

  • Xem dữ liệu

    Đây là định dạng được sử dụng để tự điền vào các trường biểu mẫu. Đó cũng là định dạng mà người dùng sẽ gửi dữ liệu. Khi bạn gọi Form::submit($data), dữ liệu $ ở định dạng dữ liệu "xem".

Hai loại máy biến áp khác nhau giúp chuyển đổi đến và từ mỗi loại dữ liệu sau:

  • Máy biến áp mô hình :

    transform(): "dữ liệu mô hình" => "dữ liệu định mức"
    reverseTransform(): "dữ liệu định mức" => "dữ liệu mô hình"

  • Xem máy biến áp :

    transform(): "dữ liệu định mức" => "xem dữ liệu"
    reverseTransform(): "xem dữ liệu" => "dữ liệu định mức"

Bạn cần biến áp nào tùy thuộc vào tình hình của bạn.

Để sử dụng máy biến áp xem, hãy gọi addViewTransformer().


Nếu bạn muốn lấy tất cả dữ liệu biểu mẫu:

$form->getData();

Nếu bạn đang theo dõi một trường biểu mẫu cụ thể (ví dụ first_name):

$form->get('first_name')->getData();


4

Tôi đã làm cho nó hoạt động bằng cách này:

if ($request->getMethod() == 'POST') {
    $username = $request->request->get('username');
    $password = $request->request->get('password');

    // Do something with the post data
}

Bạn cũng cần có yêu cầu Request $ làm tham số trong hàm! Hi vọng điêu nay co ich.


nếu biểu mẫu của bạn không được tạo bằng trình tạo biểu mẫu sf2 thì chỉ điều này mới hiển thị cho bạn giá trị biểu mẫu chứ không phải các giải pháp khác. +1 bạn đời
Nikhil Chaudhary

4

Tôi nghĩ rằng để lấy dữ liệu yêu cầu, được ràng buộc và xác thực bởi đối tượng biểu mẫu, bạn phải sử dụng lệnh này:

$form->getViewData();
$form->getClientData(); // Deprecated since version 2.1, to be removed in 2.3.

Đây là những gì tôi đang tìm kiếm. Dự án tôi đang làm là trong symfony 2.0 và không thể cập nhật được.
Naomi

3
private function getFormDataArray($form)
{
    $data = [];
    foreach ( $form as $key => $value) {
        $data[$key] = $value->getData();
    }
    return $data;
}

Nếu biểu mẫu của bạn có biểu mẫu con, mã này sẽ giống như sau:$data[$key] = is_object($value->getData()) ? $this->getFormDataArray($value) : $value->getData();
Aliance

2

Nếu bạn đang sử dụng quản lý bảo mật Symfony 2, bạn không cần nhận các giá trị đã đăng, bạn chỉ cần quản lý mẫu biểu mẫu (xem tài liệu ).

Nếu bạn không sử dụng quản lý bảo mật Symfony 2, tôi khuyên bạn nên sử dụng nó. Nếu bạn không muốn hoặc nếu bạn không thể, bạn có thể cung cấp cho chúng tôi LoginTypenguồn của?


Cảm ơn @BlackCharly Tôi đang bắt đầu đọc tài liệu. Tôi cũng đã cập nhật mã để cung cấp cho người đọc sự rõ ràng hoàn toàn với cùng một. Đánh giá cao sự giúp đỡ của bạn.
VishwaKumar

1

Nếu Symfony 4 hoặc 5, hãy sử dụng mã này (Trong đó tên là tên trường của bạn):

$request->request->get('name');

0

Đối với các trường biểu mẫu không được ánh xạ, tôi sử dụng $ form-> get ('inputName') -> getViewData ();

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.