1212namespace League \FlysystemBundle \Adapter \Builder ;
1313
1414use League \FlysystemBundle \Adapter \AdapterDefinitionFactory ;
15+ use League \FlysystemBundle \Exception \MissingPackageException ;
1516use Symfony \Component \DependencyInjection \Definition ;
1617use Symfony \Component \OptionsResolver \OptionsResolver ;
1718
@@ -31,6 +32,8 @@ public function __construct(AdapterDefinitionFactory $definitionFactory)
3132
3233 final public function createDefinition (array $ options ): Definition
3334 {
35+ $ this ->ensureRequiredPackagesAvailable ();
36+
3437 $ resolver = new OptionsResolver ();
3538 $ this ->configureOptions ($ resolver );
3639
@@ -41,7 +44,30 @@ final public function createDefinition(array $options): Definition
4144 return $ definition ;
4245 }
4346
47+ abstract protected function getRequiredPackages (): array ;
48+
4449 abstract protected function configureOptions (OptionsResolver $ resolver );
4550
4651 abstract protected function configureDefinition (Definition $ definition , array $ options );
52+
53+ private function ensureRequiredPackagesAvailable ()
54+ {
55+ $ missingPackages = [];
56+ foreach ($ this ->getRequiredPackages () as $ requiredClass => $ packageName ) {
57+ if (!class_exists ($ requiredClass )) {
58+ $ missingPackages [] = $ packageName ;
59+ }
60+ }
61+
62+ if (!$ missingPackages ) {
63+ return ;
64+ }
65+
66+ throw new MissingPackageException (sprintf (
67+ "Missing package%s, to use the \"%s \" adapter, run: \n\ncomposer require %s " ,
68+ \count ($ missingPackages ) > 1 ? 's ' : '' ,
69+ $ this ->getName (),
70+ implode (' ' , $ missingPackages )
71+ ));
72+ }
4773}
0 commit comments