2014-11-26 2 views
-1

У меня есть форма:сериализации формы в пользовательские объекты

<form...> 
    <input type="text" name="Name" /> 
    <input type="text" name="Age" /> 
</form> 

Эти данные размещены на мой контроллер:

... 
public function PostCreatePerson() 
{ 
    $data = Input::all(); 
    // I end up with an array 
} 
... 

Теперь представьте себе, вместо того, чтобы иметь массив ... или массив просто приведённый к StdClass ... Я хочу, чтобы бросить его в пользовательский объект

... 
public function PostCreatePerson() 
{ 
    $data = (Person)Input::all(); 
    // I end up with a Person 
} 
... 

Q: есть ли framewor ks, которые имеют этот процесс сериализации как приятная небольшая функция? Или я застрял в том, что мне нужно было сопоставить его? Что еще более конкретно, есть ли встроенный в Laravel?

... 
public function PostCreatePerson() 
{ 
    $person = new Person(); 
    $person->Name = Input::get("Name"); 
    $person->Age = Input::get("Age"); 
} 
... 

Этот вопрос исходит из того, что в C# .NET MVC, форма сообщение его данные в контроллер, а также рамка сериализуют данные в тип объекта, который находится в контроллере ... и я совсем как этот синтаксис.

... 
public void PostCreatePerson(Person person) 
{ 
    // person is of type Person and pre-mapped from the form data 
} 
... 


Я сделал еще немного поэкспериментировать ...

Если я взгляну на сырье размещены данные:

$data = file_get_contents("php://input"); 

Это выглядит как это:

Name=James&Age=25 

Если посмотреть на упорядоченный объект:

$serialized = serialize(new Person()); 

это выглядит следующим образом:

O:6:"Person":2:{s:4:"Name";N;s:3:"Age";N;} 

Если была структура, которая спрашивает метод контроллера, какой тип вы ищете?

public function PostCreatePerson(Person $person) 
{... 

А потом говорит, о HangOn ... «Человек» соответствует типу «Человек», так это то, что мне нужно отобразить в.

После того, как сопоставляются:

O:6:"Person":2:{s:4:"Name";s:5:"James";s:3:"Age";i:25;} 

Это десериализует его и вводит его в собственность, которая хотела его.

Тогда ваша форма была успешно отображается в пользовательском класс ...

Интересно, есть ли рамка или плагин, который делает это?

Я только поиграл с идеей изменения строки сериализации, чтобы иметь значения, потому что тогда она не будет называть конструкцию Person ... Возможно, иметь выбор вызова или не вызывать конструкцию также является допустимым требованием?

+0

Любые причины, чтобы закрыть это? Возможно, я могу расширить свой вопрос, хотя, думаю, я был основательным? – Jimmyt1988

+0

Что именно вы пытаетесь выполнить после его сериализации? Если ваша цель - просто сохранить его в базе данных, тогда ответ Razors правильный. – Jeff

ответ

-1

Вы можете определенно сделать то же самое в php.

public function PostCreatePerson(Person $person) ожидает, что $person будет примером Person. В Laravel вы можете видеть этот тип спецификации много раз, особенно с интерфейсами.

+0

Я не уверен, что вы поняли вопрос. – Jimmyt1988

+0

Я не уверен, что вы поняли ответ. То, что вы имеете в виду, это именно «запрос», реализованный в новом Laravel 5. – phaberest

+0

$ человек никогда не будет иметь человека, переданного в него из формы ... Это не так, как это работает. Для инъекции зависимости фабрика создает необходимый конкретный экземпляр и вводит его в конструкцию класса, это действительно работает. Мы говорим о другой вещи, нет? – Jimmyt1988

0

Вы всегда можете просто пропустить свой вход и сопоставить их с вашей моделью, как показано ниже. Передача экземпляра модели позволит использовать его в течение:

public function PostCreatePerson() { 

    $person = new Person(); 

    $data = Input::only('Name', 'Age'); 

    foreach ($data as $field => $val) { 
     $person->{$field} = $val; 
    } 

    $person->save(); 

} 

Очевидно, что вы бы проверить у вас правильные поля, прежде чем пытаться их спасти.

ИЛИ Если вы просто означает, назначая их на объект, и вы всегда можете использовать:

public function PostCreatePerson() { 

    $person = new stdClass(); 

    $data = Input::only('Name', 'Age'); 

    foreach ($data as $field => $val) { 
     $person->{$field} = $val; 
    } 
} 

Это позволит вам получить доступ к поля как: $ человек-> Имя

+0

Откуда возникает человек Person? Это не волшебное сообщение из формы в этот параметр ... Он скажет, что $ person ожидается экземпляр типа Person, ни одного заданного ... Однако, если цикл перечеркивания будет отображать объект в порядке, я задавался вопросом, есть ли рамки Laravel или аналогичные, которые сделают это для меня, со всеми грубыми мелочами, с которыми вы сталкиваетесь, уже разобрались. – Jimmyt1988

1

вы можете установить кучу параметров сразу:

$person = new Person(Input::only('Name','Age')); 

чтобы справиться с mass assignment, вам нужно определить Fillable атрибуты:

class Person extends Eloquent { 

    protected $fillable = array('Name', 'Age'); 

} 
+0

Мне это нравится, потому что вы также можете сохранить свою конструкцию. – Jimmyt1988

Смежные вопросы