Overriding class problems when using PHP class_alias in a functional test

I am using PHP 5.3 class_alias to handle my forms of Symfony 1.4 (Doctrine). I use one action to process multiple pages of a form, but using the switch statement to select the form class to use.

public function executeEdit(sfWebRequest $request) {
  switch($request->getParameter('page')) {
    case 'page-1':
      class_alias('MyFormPage1Form', 'FormAlias');
    break;
    ...
  }
  $this->form = new FormAlias($obj);
}

This works brilliantly when viewing a website, but it fails to complete my functional tests, because when a page loads more than once, for example:

$browser->info('1 - Edit Form Page 1')->

  get('/myforms/edit')->
  with('response')->begin()->
    isStatusCode(200)->
  end()->

  get('/myforms/edit')->
  with('response')->begin()->
    isStatusCode(200)->
  end();

I get a 500 response to the second request with the following error:

The last request threw an uncaught RuntimeException: PHP sent a warning to /.../apps/frontend/modules/.../actions/actions.class.php line 225 (Cannot update the FormAlias ​​class)

( ).

, Symfony . "unalias" ​​?

+3
3

, :

public function executeEdit(sfWebRequest $request) {
  $formType;
  switch($request->getParameter('page')) {
    case 'page-1':
      $formType = 'MyFormPage1Form';
    break;
    ...
  }
  $this->form = new $formType();
}

class_alias, .

+2

, , , , "". , , reset . , ?

, case. , , .

public function executeEdit(sfWebRequest $request) {
  switch($request->getParameter('page')) {
    case 'page-1':
      $form = new MyFormPage1Form($obj);
    break;
    ...
  }
  $this->form = $form;
}

hardcoding switch/case class_alias. . , "" "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);
}

Symfony Components DI Container, factory . . , class_alias .

+1
function class_alias_once($class, $alias) {
    if (!class_exists($alias)) {
        class_alias($class, $alias);
    }
}

This does not solve the problem, but using this function, you will not get an error. Perhaps this will be enough for your purpose.

0
source

Source: https://habr.com/ru/post/1757804/


All Articles