Passed
Push — master ( 62919d...1f65fa )
by Iman
04:23
created

ControllerGenerator   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 126
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 126
rs 10
c 0
b 0
f 0
wmc 13

6 Methods

Rating   Name   Duplication   Size   Complexity  
A handleForeignKey() 0 18 2
A handleOtherFields() 0 9 2
A addCol() 0 22 4
A generateController() 0 10 1
A getControllerName() 0 12 3
A generateControllerCode() 0 10 1
1
<?php
2
3
namespace Crocodicstudio\Crudbooster\Modules\ModuleGenerator;
4
5
use Crocodicstudio\Crudbooster\helpers\DbInspector;
6
use Crocodicstudio\Crudbooster\Modules\ModuleGenerator\ControllerGenerator\FormConfigGenerator;
7
use Crocodicstudio\Crudbooster\Modules\ModuleGenerator\ControllerGenerator\FieldDetector;
8
use Schema;
9
10
class ControllerGenerator
11
{
12
    public static function generateController($table, $name = null)
13
    {
14
15
        $controllerName = self::getControllerName($table, $name);
16
17
        $php = self::generateControllerCode($table, $controllerName);
18
        //create file controller
19
        FileManipulator::putCtrlContent($controllerName, $php);
20
21
        return $controllerName;
22
    }
23
24
    /**
25
     * @param $table
26
     * @param $name
27
     * @return string
28
     */
29
    private static function getControllerName($table, $name = null)
30
    {
31
        $controllerName = ucwords(str_replace(['_', '-'], ' ', $name ?: $table));
32
        $controllerName = 'Admin'.str_replace(' ', '', $controllerName).'Controller';
33
34
        $countSameFile = count(glob(controllers_dir().$controllerName.'*.php'));
35
36
        if ($countSameFile > 0) {
37
            $controllerName .= $countSameFile;
38
        }
39
40
        return $controllerName;
41
    }
42
43
    /**
44
     * @param $table
45
     * @param $controllerName
46
     * @return string
47
     * @throws \Exception
48
     * @throws \Throwable
49
     */
50
    private static function generateControllerCode($table, $controllerName)
51
    {
52
        $coloms = \Schema::getColumnListing($table);
53
        $pk = DbInspector::findPk($table);
54
        $formArrayString = FormConfigGenerator::generateFormConfig($table, $coloms);
55
        list($cols, $joinList) = self::addCol($table, $coloms, $pk);
56
57
        $data = compact('controllerName', 'table', 'pk', 'coloms', 'cols', 'formArrayString', 'joinList');
58
59
        return '<?php ' . view('CbModulesGen::controller_stub', $data)->render();
60
    }
61
62
    /**
63
     * @param $table
64
     * @param $coloms
65
     * @param $pk
66
     * @return array
67
     */
68
    private static function addCol($table, $coloms, $pk)
69
    {
70
        $coloms_col = array_filter($coloms, function ($field) {
71
            return (! FieldDetector::isExceptional($field) && ! FieldDetector::isPassword($field));
72
        });
73
        $coloms_col = array_slice($coloms_col, 0, 10);
74
75
        $joinList = [];
76
        $cols = [];
77
        foreach ($coloms_col as $field) {
78
            $label = str_replace("id_", "", $field);
79
            $label = ucwords(str_replace("_", " ", $label));
80
            $label = str_replace('Cms ', '', $label);
81
82
            if (FieldDetector::isForeignKey($field)) {
83
                list($cols, $joinList) = self::handleForeignKey($table.'.'.$pk, $field, $label, $cols, $joinList);
84
            } else {
85
                $cols = self::handleOtherFields($field, $label, $cols);
86
            }
87
        }
88
89
        return [$cols, $joinList];
90
    }
91
92
    /**
93
     * @param $field2
94
     * @param $field
95
     * @param $label
96
     * @param $cols
97
     * @param $joinList
98
     * @return array
99
     * @throws \Exception
100
     */
101
    private static function handleForeignKey($field2, $field, $label, $cols, $joinList)
102
    {
103
        $jointable = str_replace(['id_', '_id'], '', $field);
104
105
        if (! Schema::hasTable($jointable)) {
106
            return [$cols, $joinList];
107
        }
108
        $joincols = \Schema::getColumnListing($jointable);
109
        $joinname = DbInspector::colName($joincols);
110
        $cols[] = ['label' => $label, 'name' => "'".$jointable.$joinname."'"];
111
        $jointablePK = DbInspector::findPk($jointable);
112
        $joinList[] = [
113
            'table' => $jointable,
114
            'field1' => $jointable.'.'.$jointablePK,
115
            'field2' => $field2,
116
        ];
117
118
        return [$cols, $joinList];
119
    }
120
121
    /**
122
     * @param $field
123
     * @param $label
124
     * @param $cols
125
     * @return array
126
     */
127
    private static function handleOtherFields($field, $label, $cols)
128
    {
129
        $image = '';
130
        if (FieldDetector::isImage($field)) {
131
            $image = '"image" => true';
132
        }
133
        $cols[] = ['label' => $label, 'name' => "'$field', $image"];
134
135
        return $cols;
136
    }
137
}