Вход Регистрация
Файл: vendor/symfony/error-handler/ErrorRenderer/FileLinkFormatter.php
Строк: 133
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentErrorHandlerErrorRenderer;

use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpFoundationRequestStack;
use 
SymfonyComponentRoutingGeneratorUrlGeneratorInterface;

/**
 * Formats debug file links.
 *
 * @author Jérémy Romey <jeremy@free-agent.fr>
 *
 * @final
 */
class FileLinkFormatter
{
    private array|
false $fileLinkFormat;
    private ?
RequestStack $requestStack null;
    private ?
string $baseDir null;
    private 
Closure|string|null $urlFormat;

    
/**
     * @param string|Closure $urlFormat The URL format, or a closure that returns it on-demand
     */
    
public function __construct(string|array|null $fileLinkFormat null, ?RequestStack $requestStack null, ?string $baseDir nullstring|Closure|null $urlFormat null)
    {
        
$fileLinkFormat ??= $_ENV['SYMFONY_IDE'] ?? $_SERVER['SYMFONY_IDE'] ?? '';

        if (!
is_array($f $fileLinkFormat)) {
            
$f = (ErrorRendererInterface::IDE_LINK_FORMATS[$f] ?? $f) ?: ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format') ?: 'file://%f#L%l';
            
$i strpos($f'&'max(strrpos($f'%f'), strrpos($f'%l'))) ?: strlen($f);
            
$fileLinkFormat = [substr($f0$i)] + preg_split('/&([^>]++)>/'substr($f$i), -1PREG_SPLIT_DELIM_CAPTURE);
        }

        
$this->fileLinkFormat $fileLinkFormat;
        
$this->requestStack $requestStack;
        
$this->baseDir $baseDir;
        
$this->urlFormat $urlFormat;
    }

    
/**
     * @return string|false
     */
    
public function format(string $fileint $line): string|bool
    
{
        if (
$fmt $this->getFileLinkFormat()) {
            for (
$i 1; isset($fmt[$i]); ++$i) {
                if (
str_starts_with($file$k $fmt[$i++])) {
                    
$file substr_replace($file$fmt[$i], 0strlen($k));
                    break;
                }
            }

            return 
strtr($fmt[0], ['%f' => $file'%l' => $line]);
        }

        return 
false;
    }

    
/**
     * @internal
     */
    
public function __sleep(): array
    {
        
$this->fileLinkFormat $this->getFileLinkFormat();

        return [
'fileLinkFormat'];
    }

    
/**
     * @internal
     */
    
public static function generateUrlFormat(UrlGeneratorInterface $routerstring $routeNamestring $queryString): ?string
    
{
        try {
            return 
$router->generate($routeName).$queryString;
        } catch (
Throwable) {
            return 
null;
        }
    }

    private function 
getFileLinkFormat(): array|false
    
{
        if (
$this->fileLinkFormat) {
            return 
$this->fileLinkFormat;
        }

        if (
$this->requestStack && $this->baseDir && $this->urlFormat) {
            
$request $this->requestStack->getMainRequest();

            if (
$request instanceof Request && (!$this->urlFormat instanceof Closure || $this->urlFormat = ($this->urlFormat)())) {
                return [
                    
$request->getSchemeAndHttpHost().$this->urlFormat,
                    
$this->baseDir.DIRECTORY_SEPARATOR'',
                ];
            }
        }

        return 
false;
    }
}

if (!
class_exists(SymfonyComponentHttpKernelDebugFileLinkFormatter::class, false)) {
    
class_alias(FileLinkFormatter::class, SymfonyComponentHttpKernelDebugFileLinkFormatter::class);
}
Онлайн: 0
Реклама