• Плагины для web-приложения. Как это работает и как реализовывать?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Плагинная система может быть основана на событиях.
    Например, в каком-то месте приложения вы вызываете подпрограмму Х, которая делает нечто полезное, и вы хотите дать возможность плагинам изменить или дополнить результат этих действий. Тогда вы вы перед или после вызова подпрограммы Х оповещаете систему определенным событием, что сейчас можно выполнить какой-то код. Если на данное событие подписан плагин, он вызывается, ему на вход передаются начальные данные, к которыми он что-то делает и возвращает результат работы системе. Вместе с данными, плагину можно передавать и все необходимые для работы интерфейсы.
    Ответ написан
    1 комментарий
  • Как загрузить роутинги сразу из нескольких файлов?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Если вы знаете расположение конфигов, то можно так:
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\Routing\Loader\YamlFileLoader;
    use Symfony\Component\Routing\RouteCollectionBuilder;
    
    require_once __DIR__.'/../vendor/autoload.php';
    
    $locator = new FileLocator([__DIR__.'/../data']);
    $loader = new YamlFileLoader($locator);
    
    $builder = new RouteCollectionBuilder($loader);
    $builder->import('dir1/routes.yaml');
    $builder->import('dir2/routes.yaml');
    
    $routes = $builder->build();
    var_dump($routes);


    Если расположение конфигов неизвестно или вы просто не хотите заморачиваться при добавлении новых:
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\Config\Loader\DelegatingLoader;
    use Symfony\Component\Config\Loader\LoaderResolver;
    use Symfony\Component\Routing\Loader\GlobFileLoader;
    use Symfony\Component\Routing\Loader\YamlFileLoader;
    use Symfony\Component\Routing\RouteCollectionBuilder;
    
    require_once __DIR__.'/../vendor/autoload.php';
    
    $locator = new FileLocator([__DIR__.'/../data']);
    $resolver = new LoaderResolver([
        new GlobFileLoader($locator), // needs symfony/finder
        new YamlFileLoader($locator),
    ]);
    $loader = new DelegatingLoader($resolver);
    
    $builder = new RouteCollectionBuilder($loader);
    $builder->import('**/*/routes.yaml', '/', 'glob');
    
    $routes = $builder->build();
    var_dump($routes);
    Ответ написан
    Комментировать