Я точно не знаю, возможно ли это, но, судя по Руководству, я бы сказал, нет. Как только у класса есть псевдоним, нет способа сбросить его или повторно объявить его с другим именем. Но опять же, зачем вообще использовать псевдоним?
Из вашего кода я предполагаю, что вы делаете псевдонимы в каждом дополнительном блоке case
. Но если это так, вы можете просто создать экземпляр формы в этих блоках, например,
public function executeEdit(sfWebRequest $request) {
switch($request->getParameter('page')) {
case 'page-1':
$form = new MyFormPage1Form($obj);
break;
...
}
$this->form = $form;
}
Вы все равно жестко кодируете имена классов в блоке switch / case при использовании class_alias
. Там нет никакого преимущества в его использовании. Если вы хотите сделать это динамически, вы можете создать отображение массива из 'page' в 'className', а затем просто найти соответствующий класс.
public function executeEdit(sfWebRequest $request) {
$mapping = array(
'page-1' => 'MyFormPage1Form',
// more mappings
);
$form = NULL;
$id = $request->getParameter('page');
if(array_key_exists($id, $mapping)) {
$className = $mapping[$id];
$form = new $className($obj);
}
$this->form = $form;
}
Таким образом, вы также можете поместить все сопоставление в файл конфигурации. Или вы можете создать FormFactory.
public function executeEdit(sfWebRequest $request) {
$this->form = FormFactory::create($request->getParameter('page'), $obj);
}
Если вы используете DI-контейнер Symfony Components , вы также можете избавиться от жестко закодированной заводской зависимости и просто использовать служебный контейнер для получения формы. Это был бы самый чистый подход ИМО. По сути, использование class_alias
кажется мне здесь неуместным.