getName() . '/' . \basename($file->getName(), '.php')) || ($appInfo !== null && \basename($file->getName(), '.php') !== $appInfo->getInternalName()) ) { continue; } self::installRoutesHooks(__DIR__ . '/../../' . $child->getName() . '/' . \basename($file->getName(), '.php') . '/' . $type . '.php', $file->getPath()); } } elseif ($child instanceof File) { if (!\is_dir(__DIR__ . '/../../' . $child->getName()) || ($appInfo !== null && \basename($child->getName(), '.php') !== $appInfo->getInternalName()) ) { continue; } self::installRoutesHooks(__DIR__ . '/../../' . $child->getName() . '/' . $type . '.php', $child->getPath()); } } } /** * Deactivate module. * * @param ApplicationAbstract $app Application * @param ModuleInfo $info Module info * * @return void * * @since 1.0.0 */ public static function deactivate(ApplicationAbstract $app, ModuleInfo $info) : void { self::deactivateRoutes($info); self::deactivateHooks($info); } /** * Deactivate routes. * * @param ModuleInfo $info Module info * @param null|ApplicationInfo $appInfo Application info * * @return void * * @since 1.0.0 */ public static function deactivateRoutes(ModuleInfo $info, ?ApplicationInfo $appInfo = null) : void { self::deactivateRoutesHooks($info, 'Routes', $appInfo); } /** * Deactivate routes and hooks. * * @param ModuleInfo $info Module info * @param string $type Is 'Routes' or 'Hooks' * @param null|ApplicationInfo $appInfo Application info * * @return void * * @since 1.0.0 */ public static function deactivateRoutesHooks(ModuleInfo $info, string $type, ?ApplicationInfo $appInfo = null) : void { $directories = new Directory(static::PATH . '/'. $type); /** @var Directory|File $child */ foreach ($directories as $child) { if ($child instanceof Directory) { /** @var File $file */ foreach ($child as $file) { if (!\is_dir(__DIR__ . '/../../' . $child->getName() . '/' . \basename($file->getName(), '.php')) || ($appInfo !== null && \basename($file->getName(), '.php') !== $appInfo->getInternalName()) ) { continue; } self::uninstallRoutesHooks(__DIR__ . '/../../' . $child->getName() . '/' . \basename($file->getName(), '.php') . '/'. $type . '.php', $file->getPath()); } } elseif ($child instanceof File) { if (!\is_dir(__DIR__ . '/../../' . $child->getName()) || ($appInfo !== null && \basename($child->getName(), '.php') !== $appInfo->getInternalName()) ) { continue; } self::uninstallRoutesHooks(__DIR__ . '/../../' . $child->getName() . '/'. $type . '.php', $child->getPath()); } } } /** * Uninstall routes. * * @param string $destRoutePath Destination route path * @param string $srcRoutePath Source route path * * @return void * * @throws PermissionException * * @since 1.0.0 */ protected static function uninstallRoutesHooks(string $destRoutePath, string $srcRoutePath) : void { if (!\is_file($destRoutePath) || !\is_file($srcRoutePath) ) { return; } if (!\is_writable($destRoutePath)) { throw new PermissionException($destRoutePath); // @codeCoverageIgnore } /** @noinspection PhpIncludeInspection */ $appRoutes = include $destRoutePath; /** @noinspection PhpIncludeInspection */ $moduleRoutes = include $srcRoutePath; $appRoutes = ArrayUtils::array_diff_assoc_recursive($appRoutes, $moduleRoutes); \file_put_contents($destRoutePath, '