简体   繁体   中英

Composer: two libraries class name conflict

I am using these two libraries from composer

"require": {
  "alterfw/php-form-generator": "^0.1.2",
  "rlanvin/php-form": "dev-master"
},

Biggest issue is both has the same class name Form with no namespace defined. Now no matter either I am instantiating only one class or both on the same page it is giving me an error as below

Fatal error: Call to undefined method Form::create() in...

create method is to generate form markup from alterfw/php-form-generator library.

So when I tried this

$form = Form::create('path-to-action.php');
$form->add(Form::text('settings')->setLabel('Settings')->setValue('None'));
echo $form->render();

Giving me the error mentioned above. For me it is difficult to understand why even I hven't instantiate another class it is still giving error.

I a also not so much familiar with composer to dig into myself without any guide.

So is there any way so I can use both libraries at the same time?

Tip : Packages without a vendor namespace are a bad practice, as you can see here. I recommend creating an issue for both packages saying they should really add a vendor namespace.

The problem here is that as soon as you use Form in your code, the class isn't already loaded and Composer's autoloader is executed. As it has 2 packages to load the class from, it'll pick the first registered autoload rule. This results in the wrong Form class: Problem!

You can swap the packages position in your composer.json , but this means the other class is no longer usable.

Another solution is to require the class yourself by using the require() / require_once() PHP functions. This is a bad practice and also means you can only use one of the 2 Form classes (requiring the other form class after one is already required results in a "Class with name "Form" already exists" PHP error).

TL;DR : You can only use one of the 2 packages in the same application.

There is really no shortage of form validation libraries. Every single framework should have one component for this.

So I'd recommend selecting your libraries carefully.

We have here the first library "alterfw/php-form-generator", which is 4 years old, being unmaintained since then, until it got forked 4 months ago with adding composer.json . Four years ago, PHP 5.2 was still common, so it is no real surprise that this code has no namespace. It also has no real documentation, because the link in the readme file is dead. The forked repository of this library does not allow creating issues. :( I doubt that the upstream repository will care about anything after 4 years of not maintaining it.

The second library "rlanvin/php-form" seems to be tied to non-public code. You opened a ticket to add namespace to that one class, and effectively got rejected (saying that the maintainer will not add namespaces because it is more convenient for him, but you could edit the file yourself to add it simply does not cut it). Packagist shows that this library has 31 installs. It's not completely right to say that "nobody uses this code", but it is very close.

If your task is form validation and form generation, I'd say that either the Symfony or Zend components will likely perform that task very well. There probably is no need to resort to libraries that "nobody" uses, and that do not apply modern development methods like namespaces (available since PHP 5.3, which was released in 2009).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM