19 private $componentRegistrar;
24 private $xmlPersistor;
35 $this->xmlPersistor = $xmlPersistor;
43 private function initEmptyDom()
45 return new \SimpleXMLElement(
47 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 48 xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd"> 60 foreach ($schemaListener->
getTables() as $moduleName => $tablesData) {
66 $schemaPatch = sprintf(
'%s/etc/db_schema.xml',
$path);
67 if (file_exists($schemaPatch)) {
70 $dom = $this->initEmptyDom();
73 foreach ($tablesData as
$tableName => $tableData) {
74 $tableData = $this->handleDefinition($tableData);
75 $table = $dom->addChild(
'table');
77 $table->addAttribute(
'resource', $tableData[
'resource']);
78 if (isset($tableData[
'engine']) && $tableData[
'engine'] !==
null) {
79 $table->addAttribute(
'engine', $tableData[
'engine']);
82 $this->processColumns($tableData,
$table);
83 $this->processConstraints($tableData,
$table);
84 $this->processIndexes($tableData,
$table);
87 $this->persistModule($dom, $schemaPatch);
98 private function handleDefinition(array $definition)
100 if (isset($definition[
'disabled']) && !$definition[
'disabled']) {
101 unset($definition[
'disabled']);
113 private function castBooleanToString($boolean)
115 return $boolean ?
'true' :
'false';
125 private function processColumns(array $tableData, \SimpleXMLElement
$table)
127 if (isset($tableData[
'columns'])) {
128 foreach ($tableData[
'columns'] as $columnData) {
129 $columnData = $this->handleDefinition($columnData);
130 $domColumn =
$table->addChild(
'column');
131 $domColumn->addAttribute(
'xsi:type', $columnData[
'xsi:type'],
'xsi');
132 unset($columnData[
'xsi:type']);
134 foreach ($columnData as $attributeKey => $attributeValue) {
135 if ($attributeValue ===
null) {
139 if (is_bool($attributeValue)) {
140 $attributeValue = $this->castBooleanToString($attributeValue);
143 $domColumn->addAttribute($attributeKey, $attributeValue);
158 private function processIndexes(array $tableData, \SimpleXMLElement
$table)
160 if (isset($tableData[
'indexes'])) {
161 foreach ($tableData[
'indexes'] as $indexName => $indexData) {
162 $indexData = $this->handleDefinition($indexData);
163 $domIndex =
$table->addChild(
'index');
164 $domIndex->addAttribute(
'name', $indexName);
166 if (isset($indexData[
'disabled']) && $indexData[
'disabled']) {
167 $domIndex->addAttribute(
'disabled',
true);
169 $domIndex->addAttribute(
'indexType', $indexData[
'indexType']);
171 foreach ($indexData[
'columns'] as $column) {
172 $columnXml = $domIndex->addChild(
'column');
173 $columnXml->addAttribute(
'name', $column);
189 private function processConstraints(array $tableData, \SimpleXMLElement
$table)
191 if (isset($tableData[
'constraints'])) {
192 foreach ($tableData[
'constraints'] as $constraintType => $constraints) {
193 if ($constraintType ===
'foreign') {
194 foreach ($constraints as
$name => $constraintData) {
195 $constraintData = $this->handleDefinition($constraintData);
196 $constraintDom =
$table->addChild(
'constraint');
197 $constraintDom->addAttribute(
'xsi:type', $constraintType,
'xsi');
198 $constraintDom->addAttribute(
'name',
$name);
200 foreach ($constraintData as $attributeKey => $attributeValue) {
201 $constraintDom->addAttribute($attributeKey, $attributeValue);
205 foreach ($constraints as
$name => $constraintData) {
206 $constraintData = $this->handleDefinition($constraintData);
207 $constraintDom =
$table->addChild(
'constraint');
208 $constraintDom->addAttribute(
'xsi:type', $constraintType,
'xsi');
209 $constraintDom->addAttribute(
'name',
$name);
210 $constraintData[
'columns'] = $constraintData[
'columns'] ?? [];
212 if (isset($constraintData[
'disabled'])) {
213 $constraintDom->addAttribute(
'disabled', (
bool) $constraintData[
'disabled']);
216 foreach ($constraintData[
'columns'] as $column) {
217 $columnXml = $constraintDom->addChild(
'column');
218 $columnXml->addAttribute(
'name', $column);
235 private function persistModule(\SimpleXMLElement $simpleXmlElementDom,
$path)
237 $this->xmlPersistor->persist($simpleXmlElementDom,
$path);
__construct(ComponentRegistrar $componentRegistrar, XmlPersistor $xmlPersistor)
persist(SchemaListener $schemaListener)
if(!isset($_GET['name'])) $name