Laravel использует ту же форму для создания и редактирования

Я совершенно новый для Laravel, и мне нужно создать форму для создания и форму для редактирования. В моей форме у меня довольно несколько сообщений jjery ajax. Интересно, дает ли Laravel простой способ для меня использовать ту же форму для моего редактирования и создавать без необходимости добавлять тонны логики в свой код. Я не хочу проверять, есть ли в режиме редактирования или создания каждый раз при назначении значений поля при загрузке формы. Любые идеи о том, как я могу это сделать с минимальным кодированием?

Solutions Collecting From Web of "Laravel использует ту же форму для создания и редактирования"

Мне нравится использовать model binding формы model binding поэтому я могу легко заполнить поля формы соответствующим значением, поэтому я следую этому подходу (например, с помощью user модели):

 @if(isset($user)) {{ Form::model($user, ['route' => ['updateroute', $user->id], 'method' => 'patch']) }} @else {{ Form::open(['route' => 'createroute']) }} @endif {{ Form::text('fieldname1', Input::old('fieldname1')) }} {{ Form::text('fieldname2', Input::old('fieldname2')) }} {{-- More fields... --}} {{ Form::submit('Save', ['name' => 'submit']) }} {{ Form::close() }} 

Так, например, с контроллера я в основном использую ту же форму для создания и обновления, например:

 // To create a new user public function create() { // Load user/createOrUpdate.blade.php view return View::make('user.createOrUpdate'); } // To update an existing user (load to edit) public function edit($id) { $user = User::find($id); // Load user/createOrUpdate.blade.php view return View::make('user.createOrUpdate')->with('user', $user); } 

Достаточно легко в вашем контроллере:

 public function create() { $user = new User; $action = URL::route('user.store'); return View::('viewname')->with(compact('user', 'action')); } public function edit($id) { $user = User::find($id); $action = URL::route('user.update', ['id' => $id]); return View::('viewname')->with(compact('user', 'action')); } 

И вам просто нужно использовать этот способ:

 {{ Form::model($user, ['action' => $action]) }} {{ Form::input('email') }} {{ Form::input('first_name') }} {{ Form::close() }} 

Другой чистый метод с небольшим контроллером, двумя видами и частичным представлением:

UsersController.php

 public function create() { return View::('create'); } public function edit($id) { $user = User::find($id); return View::('edit')->with(compact('user')); } 

create.blade.php

 {{ Form::open( array( 'route' => ['users.index'], 'role' => 'form' ) ) }} @include('_fields') {{ Form::close() }} 

edit.blade.php

 {{ Form::model( $user, ['route' => ['users.update', $user->id], 'method' => 'put', 'role' => 'form'] ) }} @include('_fields') {{ Form::close() }} 

_fields.blade.php

 {{ Form::text('fieldname1') }} {{ Form::text('fieldname2') }} {{ Form::button('Save', ['type' => 'submit']) }} 

Простой и чистый 🙂

UserController.php

 public function create() { $user = new User(); return View::make('user.edit', compact('user')); } public function edit($id) { $user = User::find($id); return View::make('user.edit', compact('user')); } 

edit.blade.php

 {{ Form::model($user, ['url' => ['/user', $user->id]]) }} {{ Form::text('name') }} <button>save</button> {{ Form::close() }} 

Вместо того, чтобы создавать два метода – один для создания новой строки и один для обновления, вы должны использовать findOrNew() . Так:

 public function edit(Request $request, $id = 0) { $user = User::findOrNew($id); $user->fill($request->all()); $user->save(); } 

В Rails у него есть form_for helper, поэтому мы можем сделать такую ​​функцию, как form_for.

Мы можем создать макрос формы, например, в файле resource / macro / html.php:

(если вы не знаете, как настроить макрос, вы можете «laravel 5 Macro» Google »)

 Form::macro('start', function($record, $resource, $options = array()){ if ((null === $record || !$record->exists()) ? 1 : 0) { $options['route'] = $resource .'.store'; $options['method'] = 'POST'; $str = Form::open($options); } else { $options['route'] = [$resource .'.update', $record->id]; $options['method'] = 'PUT'; $str = Form::model($record, $options); } return $str; }); 

Контроллер:

 public function create() { $category = null; return view('admin.category.create', compact('category')); } public function edit($id) { $category = Category.find($id); return view('admin.category.edit', compact('category')); } 

Затем в представлении _form.blade.php:

 {!! Form::start($category, 'admin.categories', ['class' => 'definewidth m20']) !!} // here the Form fields {{!! Form::close() !!}} 

Затем просмотрите файл create.blade.php:

 @include '_form' 

Затем просмотрите файл edit.blade.php:

 @include '_form' 

Вы можете использовать привязку формы и 3 метода в вашем Controller . Вот что я делаю

 class ActivitiesController extends BaseController { public function getAdd() { return $this->form(); } public function getEdit($id) { return $this->form($id); } protected function form($id = null) { $activity = ! is_null($id) ? Activity::findOrFail($id) : new Activity; // // Your logic here // $form = View::make('path.to.form') ->with('activity', $activity); return $form->render(); } } 

И в моих взглядах у меня есть

 {{ Form::model($activity, array('url' => "/admin/activities/form/{$activity->id}", 'method' => 'post')) }} {{ Form::model($object, array('url' => "/admin/activities/form/{$object->id}", 'method' => 'post')) }} {{ Form::close() }} 

UserController.php

 use View; public function create() { return View::make('user.manage', compact('user')); } public function edit($id) { $user = User::find($id); return View::make('user.manage', compact('user')); } 

user.blade.php

 @if(isset($user)) {{ Form::model($user, ['route' => ['user.update', $user->id], 'method' => 'PUT']) }} @else {{ Form::open(['route' => 'user.store', 'method' => 'POST']) }} @endif // fields {{ Form::close() }}