├── .gitignore ├── src ├── SymfonyBundle │ ├── AjglBreakpointTwigExtensionBundle.php │ ├── Resources │ │ └── config │ │ │ └── twig.php │ └── DependencyInjection │ │ └── AjglBreakpointTwigExtensionExtension.php └── BreakpointExtension.php ├── phpunit.xml.dist ├── LICENSE ├── .php-cs-fixer.dist.php ├── tests ├── BreakpointExtensionTest.php └── SymfonyBundle │ └── DependencyInjection │ └── AjglBreakpointTwigExtensionExtensionTest.php ├── .github └── workflows │ └── tests.yaml ├── composer.json ├── CHANGELOG.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor/ 2 | *.cache 3 | composer.lock 4 | phpunit.xml 5 | -------------------------------------------------------------------------------- /src/SymfonyBundle/AjglBreakpointTwigExtensionBundle.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Ajgl\Twig\Extension\SymfonyBundle; 13 | 14 | use Symfony\Component\HttpKernel\Bundle\Bundle; 15 | 16 | /** 17 | * @author Antonio J. García Lagar 18 | */ 19 | final class AjglBreakpointTwigExtensionBundle extends Bundle 20 | { 21 | } 22 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 3 | 11 | 12 | 13 | ./tests 14 | 15 | 16 | 17 | 18 | ./src 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /src/SymfonyBundle/Resources/config/twig.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Symfony\Component\DependencyInjection\Loader\Configurator; 13 | 14 | use Ajgl\Twig\Extension\BreakpointExtension; 15 | 16 | return static function (ContainerConfigurator $container): void { 17 | $services = $container->services(); 18 | 19 | $services->set('ajgl_twig_extension.breakpoint', BreakpointExtension::class) 20 | ->private() 21 | ->tag('twig.extension'); 22 | }; 23 | -------------------------------------------------------------------------------- /src/SymfonyBundle/DependencyInjection/AjglBreakpointTwigExtensionExtension.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Ajgl\Twig\Extension\SymfonyBundle\DependencyInjection; 13 | 14 | use Symfony\Component\Config\FileLocator; 15 | use Symfony\Component\DependencyInjection\ContainerBuilder; 16 | use Symfony\Component\DependencyInjection\Extension\Extension; 17 | use Symfony\Component\DependencyInjection\Loader; 18 | 19 | /** 20 | * @author Antonio J. García Lagar 21 | */ 22 | final class AjglBreakpointTwigExtensionExtension extends Extension 23 | { 24 | public function load(array $config, ContainerBuilder $container): void 25 | { 26 | $loader = new Loader\PhpFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 27 | $loader->load('twig.php'); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013-2016 Antonio J. García Lagar 2 | 3 | Permission is hereby granted, free of charge, to any 4 | person obtaining a copy of this software and associated 5 | documentation files (the "Software"), to deal in the 6 | Software without restriction, including without limitation 7 | the rights to use, copy, modify, merge, publish, 8 | distribute, sublicense, and/or sell copies of the 9 | Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice 13 | shall be included in all copies or substantial portions of 14 | the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY 17 | KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 18 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 19 | PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 20 | OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 22 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | 9 | 10 | For the full copyright and license information, please view the LICENSE 11 | file that was distributed with this source code. 12 | EOF; 13 | 14 | return (new Config()) 15 | ->setRiskyAllowed(true) 16 | ->setRules( 17 | [ 18 | '@Symfony' => true, 19 | '@Symfony:risky' => true, 20 | 'array_syntax' => array('syntax' => 'short'), 21 | 'fully_qualified_strict_types' => true, 22 | 'header_comment' => array('header' => $header), 23 | 'native_function_invocation' => false, 24 | 'ordered_imports' => [ 25 | 'imports_order' => ['class', 'const', 'function'], 26 | ], 27 | 'phpdoc_order' => true, 28 | 'psr_autoloading' => true, 29 | 'strict_comparison' => true, 30 | 'strict_param' => true, 31 | ] 32 | ) 33 | ->setFinder( 34 | \PhpCsFixer\Finder::create() 35 | ->in(__DIR__.'/src') 36 | ->in(__DIR__.'/tests') 37 | ) 38 | ; 39 | -------------------------------------------------------------------------------- /tests/BreakpointExtensionTest.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Ajgl\Twig\Extension\Tests; 13 | 14 | use Ajgl\Twig\Extension\BreakpointExtension; 15 | use PHPUnit\Framework\TestCase; 16 | use Twig\TwigFunction; 17 | 18 | /** 19 | * @author Antonio J. García Lagar 20 | */ 21 | final class BreakpointExtensionTest extends TestCase 22 | { 23 | protected BreakpointExtension $extension; 24 | 25 | protected function setUp(): void 26 | { 27 | $this->extension = new BreakpointExtension(); 28 | } 29 | 30 | public function testGetName(): void 31 | { 32 | $this->assertSame('breakpoint', $this->extension->getName()); 33 | } 34 | 35 | public function testGetFunctions(): void 36 | { 37 | $functions = $this->extension->getFunctions(); 38 | $this->assertCount(1, $functions); 39 | $function = reset($functions); 40 | $this->assertInstanceOf(TwigFunction::class, $function); 41 | $callable = $function->getCallable(); 42 | $this->assertIsCallable($callable); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/BreakpointExtension.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Ajgl\Twig\Extension; 13 | 14 | use Composer\XdebugHandler\XdebugHandler; 15 | use Twig\Environment; 16 | use Twig\Extension\AbstractExtension; 17 | use Twig\TwigFunction; 18 | 19 | /** 20 | * @author Antonio J. García Lagar 21 | */ 22 | final class BreakpointExtension extends AbstractExtension 23 | { 24 | public function getName(): string 25 | { 26 | return 'breakpoint'; 27 | } 28 | 29 | /** 30 | * @return TwigFunction[] 31 | */ 32 | public function getFunctions(): array 33 | { 34 | return [ 35 | new TwigFunction('breakpoint', $this->setBreakpoint(...), ['needs_environment' => true, 'needs_context' => true]), 36 | ]; 37 | } 38 | 39 | public function setBreakpoint(Environment $environment, $context): string 40 | { 41 | if ($this->isXdebugActive()) { 42 | $arguments = array_slice(func_get_args(), 2); 43 | xdebug_break(); 44 | } 45 | 46 | return ''; 47 | } 48 | 49 | private function isXdebugActive(): bool 50 | { 51 | return class_exists(XdebugHandler::class) ? XdebugHandler::isXdebugActive() : function_exists('xdebug_break'); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /tests/SymfonyBundle/DependencyInjection/AjglBreakpointTwigExtensionExtensionTest.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Ajgl\Twig\Extension\Tests\SymfonyBundle\DependencyInjection; 13 | 14 | use Ajgl\Twig\Extension\BreakpointExtension; 15 | use Ajgl\Twig\Extension\SymfonyBundle\DependencyInjection\AjglBreakpointTwigExtensionExtension; 16 | use PHPUnit\Framework\TestCase; 17 | use Symfony\Component\DependencyInjection\ContainerBuilder; 18 | 19 | /** 20 | * @author Antonio J. García Lagar 21 | */ 22 | final class AjglBreakpointTwigExtensionExtensionTest extends TestCase 23 | { 24 | protected ContainerBuilder $container; 25 | 26 | protected AjglBreakpointTwigExtensionExtension $extension; 27 | 28 | protected function setUp(): void 29 | { 30 | $this->container = new ContainerBuilder(); 31 | $this->extension = new AjglBreakpointTwigExtensionExtension(); 32 | } 33 | 34 | public function testTwigExtensionsDefinition(): void 35 | { 36 | $this->extension->load([], $this->container); 37 | $this->assertTrue($this->container->hasDefinition('ajgl_twig_extension.breakpoint')); 38 | $definition = $this->container->getDefinition('ajgl_twig_extension.breakpoint'); 39 | $this->assertSame( 40 | BreakpointExtension::class, 41 | $definition->getClass() 42 | ); 43 | $this->assertNotNull($definition->getTag('twig.extension')); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /.github/workflows/tests.yaml: -------------------------------------------------------------------------------- 1 | name: "tests" 2 | 3 | on: 4 | pull_request: ~ 5 | push: ~ 6 | schedule: 7 | - cron: "17 10 12 * *" 8 | 9 | jobs: 10 | tests: 11 | runs-on: "ubuntu-latest" 12 | continue-on-error: "${{ matrix.continue-on-error }}" 13 | strategy: 14 | fail-fast: false 15 | matrix: 16 | php: ["8.2", "8.3", "8.4", "8.5"] 17 | symfony: ["5.4.*", "6.4.*", "7.3.*", "7.4.*", "8.0.*"] 18 | dependency-versions: ["highest"] 19 | composer-stable: ["1"] 20 | continue-on-error: [false] 21 | include: 22 | - php: "8.2" 23 | symfony: "5.4.*" 24 | dependency-versions: "lowest" 25 | composer-stable: "1" 26 | continue-on-error: false 27 | - php: "latest" 28 | symfony: "8.1.*" 29 | composer-flags: '' 30 | continue-on-error: true 31 | exclude: 32 | - php: "8.2" 33 | symfony: "8.0.*" 34 | - php: "8.3" 35 | symfony: "8.0.*" 36 | 37 | name: "PHP ${{ matrix.php }} - Symfony ${{ matrix.symfony }} - Composer ${{ matrix.dependency-versions }}" 38 | 39 | steps: 40 | - name: "checkout" 41 | uses: "actions/checkout@v4" 42 | 43 | - name: "setup php" 44 | uses: "shivammathur/setup-php@v2" 45 | with: 46 | php-version: "${{ matrix.php }}" 47 | tools: "composer,flex" 48 | 49 | - name: "enable Symfony Flex plugin" 50 | run: "composer global config --no-interaction allow-plugins.symfony/flex true" 51 | 52 | - name: "install composer dependencies" 53 | uses: "ramsey/composer-install@v3" 54 | env: 55 | COMPOSER_PREFER_STABLE: "${{ matrix.composer-stable }}" 56 | SYMFONY_REQUIRE: "${{ matrix.symfony }}" 57 | with: 58 | dependency-versions: "${{ matrix.dependency-versions }}" 59 | 60 | - name: "run phpunit tests" 61 | run: "vendor/bin/phpunit --colors=always" 62 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ajgl/breakpoint-twig-extension", 3 | "description": "Twig extension to set breakpoints", 4 | "license": "MIT", 5 | "type": "library", 6 | "keywords": [ 7 | "twig", 8 | "xdebug", 9 | "breakpoint" 10 | ], 11 | "authors": [ 12 | { 13 | "name": "Antonio J. García Lagar", 14 | "email": "aj@garcialagar.es", 15 | "homepage": "http://aj.garcialagar.es", 16 | "role": "developer" 17 | } 18 | ], 19 | "homepage": "https://github.com/ajgarlag/AjglBreakpointTwigExtension", 20 | "require": { 21 | "php": ">=8.2", 22 | "twig/twig": "^3.0 || ^4.0" 23 | }, 24 | "minimum-stability": "dev", 25 | "require-dev": { 26 | "composer/xdebug-handler": "^3.0", 27 | "php-cs-fixer/shim": "^3.90", 28 | "phpunit/phpunit": "^11.5 || ^12.5", 29 | "symfony/framework-bundle": "^5.4 || ^6.4 || ^7.3", 30 | "symfony/twig-bundle": "^5.4 || ^6.4 || ^7.3" 31 | }, 32 | "conflict": { 33 | "composer/xdebug-handler": "<3.0", 34 | "symfony/framework-bundle": "<5.4", 35 | "symfony/twig-bundle": "<5.4" 36 | }, 37 | "suggest": { 38 | "ext-xdebug": "The Xdebug extension is required for the breakpoint to work", 39 | "composer/xdebug-handler": "To improve de Xdebug detection", 40 | "symfony/framework-bundle": "The framework bundle to integrate the extension into Symfony", 41 | "symfony/twig-bundle": "The twig bundle to integrate the extension into Symfony" 42 | }, 43 | "autoload": { 44 | "psr-4": { 45 | "Ajgl\\Twig\\Extension\\": "src/" 46 | } 47 | }, 48 | "autoload-dev": { 49 | "psr-4": { 50 | "Ajgl\\Twig\\Extension\\Tests\\": "tests/" 51 | } 52 | }, 53 | "config": { 54 | "sort-packages": true 55 | }, 56 | "extra": { 57 | "branch-alias": { 58 | "dev-master": "0.4.x-dev" 59 | } 60 | }, 61 | "scripts": { 62 | "fix-cs": [ 63 | "@php vendor/bin/php-cs-fixer fix --ansi" 64 | ], 65 | "lint": [ 66 | "@php vendor/bin/php-cs-fixer fix --dry-run --ansi" 67 | ], 68 | "test": [ 69 | "@php vendor/bin/phpunit --colors=always" 70 | ] 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # [CHANGELOG](http://keepachangelog.com/) 2 | All notable changes to this project will be documented in this file. 3 | This project adheres to [Semantic Versioning](http://semver.org/). 4 | 5 | ## [Unreleased][unreleased] 6 | 7 | ## [0.4.5] - 2025-11-21 8 | 9 | ### Fixed 10 | - Move php-cs-fixer requirement to dev 11 | 12 | ## [0.4.4] - 2025-11-20 13 | 14 | ### Added 15 | - Add support for PHP 8.4, 8.5 16 | - Add support for Symfony 7.4 and 8.0 17 | 18 | ### Changed 19 | - Migrate config format from XML to PHP 20 | 21 | ### Removed 22 | - Drop support for PHP < 8.2 23 | - Drop support for Twig < 3.0 24 | - Drop support for Symfony 4.4, 6.3, 7.0, 7.1, and 7.2 25 | - Drop support for composer/xdebug-handler<3.0 26 | 27 | ## [0.4.3] - 2024-09-30 28 | 29 | ### Fixed 30 | - Avoid extending a deprecated class 31 | 32 | ## [0.4.2] - 2024-01-22 33 | 34 | ### Added 35 | - Add support for Symfony 7 36 | - Add support for Twig 4 37 | 38 | ## [0.4.1] - 2024-01-20 39 | 40 | ### Added 41 | - Support PHP 8.3 42 | 43 | ## [0.4.0] - 2022-12-06 44 | 45 | ### Added 46 | - Add support for PHP 8.2 47 | - Add support for Symfony 6 48 | 49 | ### Changed 50 | - Mark all classes as `final` 51 | - Add return type hints 52 | - Print an empty string with twig `breakpoint` function 53 | - Delegate Xdebug detection to `composer/xdebug-handler` when available 54 | 55 | ### Removed 56 | - Drop support for PHP<7.4 57 | - Drop support for Symfony<4.4 58 | - Drop support for Twig<2.15.3 59 | 60 | ## [0.3.5] - 2021-02-08 61 | 62 | ### Added 63 | - Add support for Symfony 5 64 | - Add support for Twig 3.x 65 | 66 | 67 | ## [0.3.4] - 2019-04-10 68 | 69 | ### Fixed 70 | - Population of `$arguments` variable 71 | 72 | 73 | ## [0.3.3] - 2019-03-18 74 | 75 | ### Fixed 76 | - Population of `$arguments` variable 77 | - Usage of deprecated classes 78 | 79 | 80 | ## [0.3.2] - 2018-12-10 81 | 82 | ### Added 83 | - Add support for Symfony 4 84 | 85 | ## [0.3.1] - 2017-11-20 86 | 87 | ### Changed 88 | - Require PHP 5.6 89 | 90 | ### Fixed 91 | - Update requirements to allow twig 2.x 92 | 93 | 94 | ## [0.3.0] - 2016-03-31 95 | 96 | ### Added 97 | - Add `$environment` and `$context` variables 98 | - Allow to inspect function arguments 99 | 100 | 101 | ## [0.2.0] - 2016-03-10 102 | 103 | ### Added 104 | - Add Symfony Bundle 105 | 106 | 107 | ## 0.1.0 - 2016-03-09 108 | 109 | ### Added 110 | - Add `breakpoint` function 111 | 112 | 113 | [unreleased]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.4.5...master 114 | [0.4.5]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.4.4...0.4.5 115 | [0.4.4]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.4.3...0.4.4 116 | [0.4.3]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.4.2...0.4.3 117 | [0.4.2]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.4.1...0.4.2 118 | [0.4.1]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.4.0...0.4.1 119 | [0.4.0]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.3.5...0.4.0 120 | [0.3.4]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.3.4...0.3.5 121 | [0.3.4]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.3.3...0.3.4 122 | [0.3.3]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.3.2...0.3.3 123 | [0.3.2]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.3.1...0.3.2 124 | [0.3.1]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.3.0...0.3.1 125 | [0.3.0]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.2.0...0.3.0 126 | [0.2.0]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/compare/0.1.0...0.2.0 127 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AjglBreakpointTwigExtension 2 | =========================== 3 | 4 | The AjglBreakpointTwigExtension component allows you set breakpoints in twig templates. 5 | 6 | [![Build Status](https://github.com/ajgarlag/AjglBreakpointTwigExtension/workflows/tests/badge.svg?branch=master)](https://github.com/ajgarlag/AjglBreakpointTwigExtension/actions) 7 | [![Latest Stable Version](https://poser.pugx.org/ajgl/breakpoint-twig-extension/v/stable.png)](https://packagist.org/packages/ajgl/breakpoint-twig-extension) 8 | [![Latest Unstable Version](https://poser.pugx.org/ajgl/breakpoint-twig-extension/v/unstable.png)](https://packagist.org/packages/ajgl/breakpoint-twig-extension) 9 | [![Total Downloads](https://poser.pugx.org/ajgl/breakpoint-twig-extension/downloads.png)](https://packagist.org/packages/ajgl/breakpoint-twig-extension) 10 | [![Montly Downloads](https://poser.pugx.org/ajgl/breakpoint-twig-extension/d/monthly.png)](https://packagist.org/packages/ajgl/breakpoint-twig-extension) 11 | [![Daily Downloads](https://poser.pugx.org/ajgl/breakpoint-twig-extension/d/daily.png)](https://packagist.org/packages/ajgl/breakpoint-twig-extension) 12 | [![License](https://poser.pugx.org/ajgl/breakpoint-twig-extension/license.png)](https://packagist.org/packages/ajgl/breakpoint-twig-extension) 13 | 14 | This component requires the [Xdebug] PHP extension to be installed. 15 | 16 | 17 | Installation 18 | ------------ 19 | 20 | To install the latest stable version of this component, open a console and execute the following command: 21 | ```bash 22 | composer require ajgl/breakpoint-twig-extension --dev 23 | ``` 24 | 25 | 26 | Usage 27 | ----- 28 | 29 | The first step is to register the extension into the twig environment 30 | ```php 31 | /* @var $twig Twig_Environment */ 32 | $twig->addExtension(new Ajgl\Twig\Extension\BreakpointExtension()); 33 | ``` 34 | 35 | Once registered, you can call the new `breakpoint` function: 36 | ```twig 37 | 38 | 39 | 40 | 41 | title 42 | 43 | 44 | {{ breakpoint() }} 45 | 46 | 47 | ``` 48 | 49 | Once stopped, your debugger will allow you to inspect the `$environment` and `$context` variables. 50 | 51 | ### Function arguments 52 | 53 | Any argument passed to the twig function will be added to the `$arguments` array, so you can inspect it easily. 54 | 55 | ```twig 56 | 57 | 58 | 59 | 60 | title 61 | 62 | 63 | {{ breakpoint(app.user, app.session) }} 64 | 65 | 66 | ``` 67 | 68 | Symfony Bundle 69 | -------------- 70 | 71 | The package includes a Symfony Bundle to automatically register the Twig extension. 72 | 73 | If the app uses Symfony Flex and you allow the recipe execution, the bundle will be enabled 74 | automatically. 75 | 76 | If you need to configure it manually, add the following line to the `config/bundles.php` file: 77 | 78 | ```php 79 | // config/bundles.php 80 | //... 81 | return [ 82 | //... 83 | Ajgl\Twig\Extension\SymfonyBundle\AjglBreakpointTwigExtensionBundle::class => ['dev' => true] 84 | ]; 85 | ``` 86 | 87 | License 88 | ------- 89 | 90 | This component is under the MIT license. See the complete license in the [LICENSE] file. 91 | 92 | 93 | Reporting an issue or a feature request 94 | --------------------------------------- 95 | 96 | Issues and feature requests are tracked in the [Github issue tracker]. 97 | 98 | 99 | Author Information 100 | ------------------ 101 | 102 | Developed with ♥ by [Antonio J. García Lagar]. 103 | 104 | If you find this component useful, please add a ★ in the [GitHub repository page]. 105 | 106 | [Xdebug]: https://xdebug.org/ 107 | [LICENSE]: LICENSE 108 | [Github issue tracker]: https://github.com/ajgarlag/AjglBreakpointTwigExtension/issues 109 | [Antonio J. García Lagar]: http://aj.garcialagar.es 110 | [GitHub repository page]: https://github.com/ajgarlag/AjglBreakpointTwigExtension 111 | [Packagist package page]: https://packagist.org/packages/ajgl/breakpoint-twig-extension 112 | --------------------------------------------------------------------------------