Passed
Push — master ( 36cb24...c3085a )
by Jianhua
08:12
created

ContentController   A

Complexity

Total Complexity 34

Size/Duplication

Total Lines 273
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 1
Metric Value
eloc 130
dl 0
loc 273
rs 9.68
c 3
b 0
f 1
wmc 34

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A delete() 0 14 2
A create() 0 11 1
A useUserDefinedIndexHandler() 0 7 2
B update() 0 33 6
A userDefinedHandlerExists() 0 9 3
A getAddOrEditViewPath() 0 11 2
A edit() 0 14 1
A index() 0 16 2
A useUserDefinedUpdateHandler() 0 7 2
A list() 0 13 2
A save() 0 23 4
A validateEntityRequest() 0 6 2
A useUserDefinedSaveHandler() 0 7 2
A useUserDefinedListHandler() 0 7 2
1
<?php
2
/**
3
 * @author  Eddy <[email protected]>
4
 */
5
6
namespace App\Http\Controllers\Admin;
7
8
use App\Http\Controllers\Controller;
9
use App\Http\Requests\Admin\ContentRequest;
10
use App\Model\Admin\Content;
11
use App\Model\Admin\Entity;
12
use App\Model\Admin\EntityField;
13
use App\Repository\Admin\ContentRepository;
14
use App\Repository\Admin\EntityFieldRepository;
15
use App\Repository\Admin\EntityRepository;
16
use Illuminate\Database\QueryException;
17
use Illuminate\Http\Request;
18
use Illuminate\Support\Str;
19
use Illuminate\View\View;
20
21
class ContentController extends Controller
22
{
23
    protected $formNames = [];
24
25
    protected $entity = null;
26
27
    public function __construct()
28
    {
29
        parent::__construct();
30
        $entity = request()->route()->parameter('entity');
31
        $this->entity = Entity::query()->findOrFail($entity);
32
        ContentRepository::setTable($this->entity->table_name);
33
        $this->breadcrumb[] = ['title' => '内容列表', 'url' => route('admin::content.index', ['entity' => $entity])];
34
    }
35
36
    /**
37
     * 内容管理-内容列表
38
     *
39
     */
40
    public function index($entity)
41
    {
42
        $result = $this->useUserDefinedIndexHandler($entity);
43
        if (!is_null($result)) {
44
            return $result;
45
        }
46
47
        $this->breadcrumb[] = ['title' => $this->entity->name . '内容列表', 'url' => ''];
48
        Content::$listField = [
49
            'title' => '标题'
50
        ];
51
        return view('admin.content.index', [
52
            'breadcrumb' => $this->breadcrumb,
53
            'entity' => $entity,
54
            'entityModel' => $this->entity,
55
            'autoMenu' => EntityRepository::systemMenu()
56
        ]);
57
    }
58
59
    /**
60
     * 内容列表数据接口
61
     *
62
     * @param Request $request
63
     * @return array
64
     */
65
    public function list(Request $request, $entity)
66
    {
67
        $result = $this->useUserDefinedListHandler($request, $entity);
68
        if (!is_null($result)) {
69
            return $result;
70
        }
71
72
        $perPage = (int) $request->get('limit', 50);
73
        $condition = $request->only($this->formNames);
74
75
        $data = ContentRepository::list($entity, $perPage, $condition);
76
77
        return $data;
78
    }
79
80
    /**
81
     * 内容管理-新增内容
82
     *
83
     */
84
    public function create($entity)
85
    {
86
        $this->breadcrumb[] = ['title' => "新增{$this->entity->name}内容", 'url' => ''];
87
        $view = $this->getAddOrEditViewPath();
88
89
        return view($view, [
90
            'breadcrumb' => $this->breadcrumb,
91
            'entity' => $entity,
92
            'entityModel' => $this->entity,
93
            'entityFields' => EntityFieldRepository::getByEntityId($entity),
94
            'autoMenu' => EntityRepository::systemMenu()
95
        ]);
96
    }
97
98
    /**
99
     * 内容管理-保存内容
100
     *
101
     * @param ContentRequest $request
102
     * @return array
103
     */
104
    public function save(ContentRequest $request, $entity)
105
    {
106
        $this->validateEntityRequest();
107
        $result = $this->useUserDefinedSaveHandler($request, $entity);
108
        if (!is_null($result)) {
109
            return $result;
110
        }
111
112
        try {
113
            ContentRepository::add($request->only(
114
                EntityFieldRepository::getByEntityId($entity)->pluck('name')->toArray()
115
            ));
116
            return [
117
                'code' => 0,
118
                'msg' => '新增成功',
119
                'redirect' => true
120
            ];
121
        } catch (QueryException $e) {
122
            \Log::error($e);
123
            return [
124
                'code' => 1,
125
                'msg' => '新增失败:' . (Str::contains($e->getMessage(), 'Duplicate entry') ? '当前内容已存在' : '其它错误'),
126
                'redirect' => false
127
            ];
128
        }
129
    }
130
131
    /**
132
     * 内容管理-编辑内容
133
     *
134
     * @param int $id
135
     * @return View
136
     */
137
    public function edit($entity, $id)
138
    {
139
        $this->breadcrumb[] = ['title' => "编辑{$this->entity->name}内容", 'url' => ''];
140
        $view = $this->getAddOrEditViewPath();
141
        $model = ContentRepository::find($id);
142
143
        return view($view, [
144
            'id' => $id,
145
            'model' => $model,
146
            'breadcrumb' => $this->breadcrumb,
147
            'entity' => $entity,
148
            'entityModel' => $this->entity,
149
            'entityFields' => EntityFieldRepository::getByEntityId($entity),
150
            'autoMenu' => EntityRepository::systemMenu()
151
        ]);
152
    }
153
154
    /**
155
     * 内容管理-更新内容
156
     *
157
     * @param ContentRequest $request
158
     * @param int $id
159
     * @return array
160
     */
161
    public function update(ContentRequest $request, $entity, $id)
162
    {
163
        $this->validateEntityRequest();
164
        $result = $this->useUserDefinedUpdateHandler($request, $entity, $id);
165
        if (!is_null($result)) {
166
            return $result;
167
        }
168
169
        $fieldInfo = EntityFieldRepository::getByEntityId($entity)
170
                        ->where('is_edit', EntityField::EDIT_ENABLE)
171
                        ->pluck('form_type', 'name')
172
                        ->toArray();
173
        $data = [];
174
        foreach ($fieldInfo as $k => $v) {
175
            if ($v === 'checkbox') {
176
                $data[$k] = '';
177
            }
178
        }
179
        $data = array_merge($data, $request->only(array_keys($fieldInfo)));
180
181
        try {
182
            ContentRepository::update($id, $data);
183
            return [
184
                'code' => 0,
185
                'msg' => '编辑成功',
186
                'redirect' => true
187
            ];
188
        } catch (QueryException $e) {
189
            \Log::error($e);
190
            return [
191
                'code' => 1,
192
                'msg' => '编辑失败:' . (Str::contains($e->getMessage(), 'Duplicate entry') ? '当前内容已存在' : '其它错误'),
193
                'redirect' => false
194
            ];
195
        }
196
    }
197
198
    /**
199
     * 内容管理-删除内容
200
     *
201
     * @param int $id
202
     */
203
    public function delete($entity, $id)
204
    {
205
        try {
206
            ContentRepository::delete($id);
207
            return [
208
                'code' => 0,
209
                'msg' => '删除成功',
210
                'redirect' => route('admin::content.index')
211
            ];
212
        } catch (\RuntimeException $e) {
213
            return [
214
                'code' => 1,
215
                'msg' => '删除失败:' . $e->getMessage(),
216
                'redirect' => route('admin::content.index')
217
            ];
218
        }
219
    }
220
221
    protected function validateEntityRequest()
222
    {
223
        $entityRequestClass = '\\App\\Http\\Requests\\Admin\\Entity\\' .
224
            Str::ucfirst(Str::singular($this->entity->table_name)) . 'Request';
225
        if (class_exists($entityRequestClass)) {
226
            $entityRequestClass::capture()->setContainer(app())->setRedirector(app()->make('redirect'))->validate();
227
        }
228
    }
229
230
    protected function useUserDefinedSaveHandler($request, $entity)
231
    {
232
        $entityControllerClass = $this->userDefinedHandlerExists('save');
233
        if ($entityControllerClass === false) {
234
            return null;
235
        }
236
        return call_user_func([new $entityControllerClass, 'save'], $request, $entity);
237
    }
238
239
    protected function useUserDefinedUpdateHandler($request, $entity, $id)
240
    {
241
        $entityControllerClass = $this->userDefinedHandlerExists('update');
242
        if ($entityControllerClass === false) {
243
            return null;
244
        }
245
        return call_user_func([new $entityControllerClass, 'update'], $request, $entity, $id);
246
    }
247
248
    protected function useUserDefinedIndexHandler($entity)
249
    {
250
        $entityControllerClass = $this->userDefinedHandlerExists('index');
251
        if ($entityControllerClass === false) {
252
            return null;
253
        }
254
        return call_user_func([new $entityControllerClass, 'index'], $entity);
255
    }
256
257
    protected function useUserDefinedListHandler($request, $entity)
258
    {
259
        $entityControllerClass = $this->userDefinedHandlerExists('list');
260
        if ($entityControllerClass === false) {
261
            return null;
262
        }
263
        return call_user_func([new $entityControllerClass, 'list'], $request, $entity);
264
    }
265
266
    /**
267
     * 判断自定义的处理方法是否存在
268
     *
269
     * @param string $method 方法名
270
     * @return string|boolean 存在返回控制器类名,不存在返回false
271
     */
272
    protected function userDefinedHandlerExists($method)
273
    {
274
        $entityControllerClass = '\\App\\Http\\Controllers\\Admin\\Entity\\' .
275
            Str::ucfirst(Str::singular($this->entity->table_name)) . 'Controller';
276
        if (class_exists($entityControllerClass) && method_exists($entityControllerClass, $method)) {
277
            return $entityControllerClass;
278
        }
279
280
        return false;
281
    }
282
283
    protected function getAddOrEditViewPath()
284
    {
285
        $view = 'admin.content.add';
286
        // 自定义模板
287
        $modelName = Str::singular($this->entity->table_name);
288
        $path = resource_path('views/admin/content/' . $modelName . '_add.blade.php');
289
        if (file_exists($path)) {
290
            $view = 'admin.content.' . $modelName . '_add';
291
        }
292
293
        return $view;
294
    }
295
}
296