В настоящее время я создаю веб-приложение, в котором есть две модели: «Донор» и «Пожертвования» соответственно. Он имеет несколько пользовательских ролей. Когда пользователь штата сначала регистрирует донора, я хочу, чтобы он был перенаправлен в другую форму, которая позволяет ему заполнять детали пожертвования (донор регистрируется после успешного первого пожертвования).
Прежде всего, должен ли я создать контроллер пожертвований, из которого я бы перенаправил пользователя, используя:
return $this->redirect(array('controller'=>'donations','action'=>'add'));
Для того, чтобы это работало, мне требуется сохранить вновь зарегистрированный идентификатор донора в сеансе:
$this->Session->write('id', $this->Donor->id);
Таким образом, пользователь перенаправляется на «пожертвования / добавление» в URL-адресе, и это отлично работает. Однако я думаю, что у этого есть некоторые недостатки. Я блуждал, должен ли я создать другое действие внутри контроллера-донора под названием «add_donation», которое будет иметь соответствующий «вид». Идея состоит в том, чтобы иметь возможность сформировать URL-адрес такого типа: «donors / add_donation / 4» (4 – donor_id!). Этот URL-адрес следует за этой конструкцией: «controller / action / id»
Если кто-то может пролить свет на лучшие практики или описать любые предостережения для моего решения (первое, используя сеанс и т. Д.), Пожалуйста, помогите брату! Я глубоко признателен вам! Заранее спасибо!
После сохранения данных вы можете сделать это в DonorsController:
$this->redirect(array( 'controller' => 'donations', 'action' => 'add', $this->Donor->getLastInsertId() ));
Нет необходимости возвращать перенаправление, это бесполезно, потому что вы перенаправляетесь. Обратите внимание, что мы передаем последний вставленный идентификатор записи как get param в перенаправление. Метод перенаправления контроллера вызывает по умолчанию _stop (), который вызывает exit ().
CakePHP3: обсуждается изменение этого поведения по умолчанию в версии 3.0 . Похоже, в CakePHP 3.0 перенаправление () по умолчанию больше не будет выходить ().
DonationsController:
public function add($donorId = null) { // Get the donor to display it if you like to if ($this->request->is('post')) { $this->request->data['Donation']['donor_id'] = $donorId; // Save code here } }
Я бы не использовал сессию здесь, особенно, не сохраняя ее до абсолютно бессмысленного и общего значения с именем «id». Если вообще я буду использовать всегда значимые имена и пространства имен, например, Donor.lastInsertId в качестве ключа сеанса.
Не всегда ясно, куда положить вещи, если они связаны, но эмпирическое правило гласит, что все должно идти в том домене, к которому они принадлежат, что довольно ясно в этом случае ИМХО.
Изменить: оставляя это право здесь, только если кому-то это нужно – оно не соответствует сценарию использования искателя. Если на этом этапе вы вошли в систему, измените функцию add
чтобы проверить, совпадает ли пропущенный userId с тем, который был зарегистрирован:
DonationsController:
public function add($donorId = null) { // Get the donor to display it if you like to if ($this->request->is('post')) { if ($this->Auth->user('id') != $donorId) { throw new InvalidArgumentException(); } $this->request->data['Donation']['donor_id'] = $donorId; // Save code here } }
Вы можете использовать тот же контроллер, используя больше моделей с использованием. Или вы также можете попросить другого контроллера с Ajax и morover, чтобы получить ответ с Json.