Voir le code source de n'importe quel fichier d'un projet Symfony

Publié le 08/02/2019 • Actualisé le 10/02/2019


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

C'est en fait le helper Twig que j'utilise sur ce site pour afficher tous les snippets. Il existe déjà un helper Twig natif source() mais il peut uniquement être utilisé pour afficher des templates. Celui-ci est plus générique et vous permet de voir le contenu de n'importe quel fichier de votre projet. (il est donc important de sécuriser les paramètres qui lui sont passés). En haut, vous pouvez voir le contenu du template _15.html.twig grâce au helper natif. En dessous, le source du nouveau helper qui est donc utilisé pour afficher son propre contenu.
PS : Vous pouvez supprimer la partie str_replace() qui est spécifique à ce projet. Jetez un coup d'œil au code d'un des snippets exécutables pour comprendre pourquoi. 😉


{{ source('snippet/code/_15.html.twig')|escape }}
{{ source_part('src/Twig/Extension/SourceExtension.php', false)|escape }}
{# End of _15.html.twig Twig template #}

<?php

declare(strict_types=1);

namespace App\Twig\Extension;

use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
use Twig\TwigFunction;

use function Symfony\Component\String\u;

/**
 * Source helpers for snippets.
 */
final class SourceExtension extends AbstractExtension
{
    public function __construct(
        readonly private KernelInterface $kernel,
        readonly private TranslatorInterface $translator,
        readonly private bool $emptySnippets, // config/services.yaml
    ) {
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('source_part', [$this, 'getSourcePart']),
        ];
    }

    public function getFilters(): array
    {
        return [
            new TwigFilter('post90_cleanup', [$this, 'post90Cleanup']),
        ];
    }

    /**
     * Can show a exact part of a file.
     */
    public function getSourcePart(string $file, bool $replaceDocBlock = true, int $start = 1, ?int $end = null): string
    {
        if ($this->emptySnippets) {
            return '';
        }

        $filename = $this->kernel->getProjectDir().'/'.$file;
        if (!is_file($filename)) {
            throw new \InvalidArgumentException(sprintf('File "%s" not found.', $file));
        }

        $sourceArr = file($filename);
        if (!\is_array($sourceArr)) {
            throw new \RuntimeException("Can't get file.");
        }

        // Take the last line
        if ($end === null) {
            $end = \count($sourceArr);
        }

        $source = implode('', \array_slice($sourceArr, $start - 1, $end - $start + 1));
        if ($replaceDocBlock) {
            $source = $this->replaceDocBlocks($source);
        }

        return u($source)->trimEnd()->toString();
    }

    private function replaceDocBlocks(string $source): string
    {
        $search = [
            '%docblock1%' => $this->translator->trans('docblock1', [], 'snippet'), // PHP
            '%docblock2%' => $this->translator->trans('docblock2', [], 'snippet'),
            '%docblock3%' => $this->translator->trans('docblock3', [], 'snippet'),
            '%docblock4%' => $this->translator->trans('docblock4', [], 'snippet'),

            '%jsDocblock1%' => $this->translator->trans('jsDocblock1', [], 'snippet'),
            '%jsDocblock2%' => $this->translator->trans('jsDocblock2', [], 'snippet'),
            '%jsDocblock3%' => $this->translator->trans('jsDocblock3', [], 'snippet'),
        ];

        return str_replace(array_keys($search), $search, $source);
    }

    public function post90Cleanup(string $html): string
    {
        $search = [
            '<p>',
            '<ul>',
            '<table>',
            '<img ',
            'href="LICENSE"',
        ];
        $replace = [
            '<p class="h4 justify">',
            '<ul class="h4">',
            '<table class="table">',
            '<img width="500px" ',
            'href="https://github.com/strangebuzz/cache-watcher/blob/master/LICENSE"',
        ];

        return str_replace($search, $replace, $html);
    }
}

 Plus sur Stackoverflow  Snippet aléatoire

  Travaillez avec moi !