welcome back to dyb-tech
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
<?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 Symfony\Flex\Configurator;
|
||||
|
||||
use Symfony\Flex\Lock;
|
||||
use Symfony\Flex\Recipe;
|
||||
use Symfony\Flex\Update\RecipeUpdate;
|
||||
|
||||
/**
|
||||
* @author Fabien Potencier <fabien@symfony.com>
|
||||
*/
|
||||
class ContainerConfigurator extends AbstractConfigurator
|
||||
{
|
||||
public function configure(Recipe $recipe, $parameters, Lock $lock, array $options = [])
|
||||
{
|
||||
$this->write('Setting parameters');
|
||||
$contents = $this->configureParameters($parameters);
|
||||
|
||||
if (null !== $contents) {
|
||||
file_put_contents($this->options->get('root-dir').'/'.$this->getServicesPath(), $contents);
|
||||
}
|
||||
}
|
||||
|
||||
public function unconfigure(Recipe $recipe, $parameters, Lock $lock)
|
||||
{
|
||||
$this->write('Unsetting parameters');
|
||||
$target = $this->options->get('root-dir').'/'.$this->getServicesPath();
|
||||
$lines = $this->removeParametersFromLines(file($target), $parameters);
|
||||
file_put_contents($target, implode('', $lines));
|
||||
}
|
||||
|
||||
public function update(RecipeUpdate $recipeUpdate, array $originalConfig, array $newConfig): void
|
||||
{
|
||||
$recipeUpdate->setOriginalFile(
|
||||
$this->getServicesPath(),
|
||||
$this->configureParameters($originalConfig, true)
|
||||
);
|
||||
|
||||
// for the new file, we need to update any values *and* remove any removed values
|
||||
$removedParameters = [];
|
||||
foreach ($originalConfig as $name => $value) {
|
||||
if (!isset($newConfig[$name])) {
|
||||
$removedParameters[$name] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
$updatedFile = $this->configureParameters($newConfig, true);
|
||||
$lines = $this->removeParametersFromLines(explode("\n", $updatedFile), $removedParameters);
|
||||
|
||||
$recipeUpdate->setNewFile(
|
||||
$this->getServicesPath(),
|
||||
implode("\n", $lines)
|
||||
);
|
||||
}
|
||||
|
||||
private function configureParameters(array $parameters, bool $update = false): string
|
||||
{
|
||||
$target = $this->options->get('root-dir').'/'.$this->getServicesPath();
|
||||
$endAt = 0;
|
||||
$isParameters = false;
|
||||
$lines = [];
|
||||
foreach (file($target) as $i => $line) {
|
||||
$lines[] = $line;
|
||||
if (!$isParameters && !preg_match('/^parameters:/', $line)) {
|
||||
continue;
|
||||
}
|
||||
if (!$isParameters) {
|
||||
$isParameters = true;
|
||||
continue;
|
||||
}
|
||||
if (!preg_match('/^\s+.*/', $line) && '' !== trim($line)) {
|
||||
$endAt = $i - 1;
|
||||
$isParameters = false;
|
||||
continue;
|
||||
}
|
||||
foreach ($parameters as $key => $value) {
|
||||
$matches = [];
|
||||
if (preg_match(sprintf('/^\s+%s\:/', preg_quote($key, '/')), $line, $matches)) {
|
||||
if ($update) {
|
||||
$lines[$i] = substr($line, 0, \strlen($matches[0])).' '.str_replace("'", "''", $value)."\n";
|
||||
}
|
||||
|
||||
unset($parameters[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($parameters) {
|
||||
$parametersLines = [];
|
||||
if (!$endAt) {
|
||||
$parametersLines[] = "parameters:\n";
|
||||
}
|
||||
foreach ($parameters as $key => $value) {
|
||||
if (\is_array($value)) {
|
||||
$parametersLines[] = sprintf(" %s:\n%s", $key, $this->dumpYaml(2, $value));
|
||||
continue;
|
||||
}
|
||||
$parametersLines[] = sprintf(" %s: '%s'%s", $key, str_replace("'", "''", $value), "\n");
|
||||
}
|
||||
if (!$endAt) {
|
||||
$parametersLines[] = "\n";
|
||||
}
|
||||
array_splice($lines, $endAt, 0, $parametersLines);
|
||||
}
|
||||
|
||||
return implode('', $lines);
|
||||
}
|
||||
|
||||
private function removeParametersFromLines(array $sourceLines, array $parameters): array
|
||||
{
|
||||
$lines = [];
|
||||
foreach ($sourceLines as $line) {
|
||||
if ($this->removeParameters(1, $parameters, $line)) {
|
||||
continue;
|
||||
}
|
||||
$lines[] = $line;
|
||||
}
|
||||
|
||||
return $lines;
|
||||
}
|
||||
|
||||
private function removeParameters($level, $params, $line)
|
||||
{
|
||||
foreach ($params as $key => $value) {
|
||||
if (\is_array($value) && $this->removeParameters($level + 1, $value, $line)) {
|
||||
return true;
|
||||
}
|
||||
if (preg_match(sprintf('/^(\s{%d}|\t{%d})+%s\:/', 4 * $level, $level, preg_quote($key, '/')), $line)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private function dumpYaml($level, $array): string
|
||||
{
|
||||
$line = '';
|
||||
foreach ($array as $key => $value) {
|
||||
$line .= str_repeat(' ', $level);
|
||||
if (!\is_array($value)) {
|
||||
$line .= sprintf("%s: '%s'\n", $key, str_replace("'", "''", $value));
|
||||
continue;
|
||||
}
|
||||
$line .= sprintf("%s:\n", $key).$this->dumpYaml($level + 1, $value);
|
||||
}
|
||||
|
||||
return $line;
|
||||
}
|
||||
|
||||
private function getServicesPath(): string
|
||||
{
|
||||
return $this->options->expandTargetDir('%CONFIG_DIR%/services.yaml');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user