Completed
Push — 4.0 ( b48f64...137622 )
by chihiro
20:21 queued 10s
created

Admin/Setting/System/MemberController.php (4 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/*
4
 * This file is part of EC-CUBE
5
 *
6
 * Copyright(c) LOCKON CO.,LTD. All Rights Reserved.
7
 *
8
 * http://www.lockon.co.jp/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Eccube\Controller\Admin\Setting\System;
15
16
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
17
use Eccube\Controller\AbstractController;
18
use Eccube\Entity\Member;
19
use Eccube\Event\EccubeEvents;
20
use Eccube\Event\EventArgs;
21
use Eccube\Form\Type\Admin\MemberType;
22
use Eccube\Repository\MemberRepository;
23
use Symfony\Component\Routing\Annotation\Route;
24
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
25
use Symfony\Component\HttpFoundation\Request;
26
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
27
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
28
29
class MemberController extends AbstractController
30
{
31
    /**
32
     * @var TokenStorageInterface
33
     */
34
    protected $tokenStorage;
35
36
    /**
37
     * @var MemberRepository
38
     */
39
    protected $memberRepository;
40
41
    /**
42
     * @var EncoderFactoryInterface
43
     */
44
    protected $encoderFactory;
45
46
    /**
47
     * MemberController constructor.
48
     *
49
     * @param EncoderFactoryInterface $encoderFactory
50
     * @param MemberRepository $memberRepository
51
     * @param TokenStorageInterface $tokenStorage
52
     */
53
    public function __construct(
54 17
        EncoderFactoryInterface $encoderFactory,
55
        MemberRepository $memberRepository,
56
        TokenStorageInterface $tokenStorage
57
    ) {
58
        $this->encoderFactory = $encoderFactory;
59 17
        $this->memberRepository = $memberRepository;
60 17
        $this->tokenStorage = $tokenStorage;
61 17
    }
62
63
    /**
64
     * @Route("/%eccube_admin_route%/setting/system/member", name="admin_setting_system_member")
65
     * @Template("@admin/Setting/System/member.twig")
66
     */
67
    public function index(Request $request)
68 1
    {
69
        $Members = $this->memberRepository->findBy([], ['sort_no' => 'DESC']);
70 1
71
        $builder = $this->formFactory->createBuilder();
72 1
73
        $event = new EventArgs(
74 1
            [
75
                'builder' => $builder,
76 1
                'Members' => $Members,
77 1
            ],
78
            $request
79 1
        );
80
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_INDEX_INITIALIZE, $event);
81 1
82
        $form = $builder->getForm();
83 1
84
        return [
85
            'form' => $form->createView(),
86 1
            'Members' => $Members,
87 1
        ];
88
    }
89
90
    /**
91
     * @Route("/%eccube_admin_route%/setting/system/member/new", name="admin_setting_system_member_new")
92
     * @Template("@admin/Setting/System/member_edit.twig")
93
     */
94
    public function create(Request $request)
95 3
    {
96
        $LoginMember = clone $this->tokenStorage->getToken()->getUser();
97 3
        $this->entityManager->detach($LoginMember);
98 3
99
        $Member = new Member();
100 3
        $builder = $this->formFactory
101 3
            ->createBuilder(MemberType::class, $Member);
102 3
103
        $event = new EventArgs([
104 3
            'builder' => $builder,
105 3
            'Member' => $Member,
106 3
        ], $request);
107 3
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_INITIALIZE, $event);
108 3
109
        $form = $builder->getForm();
110 3
        $form->handleRequest($request);
111 3
112
        if ($form->isSubmitted() && $form->isValid()) {
113 3
            $encoder = $this->encoderFactory->getEncoder($Member);
114 1
            $salt = $encoder->createSalt();
115 1
            $rawPassword = $Member->getPassword();
116 1
            $encodedPassword = $encoder->encodePassword($rawPassword, $salt);
117 1
            $Member
118
                ->setSalt($salt)
119 1
                ->setPassword($encodedPassword);
120 1
121
            $this->memberRepository->save($Member);
122 1
123
            $event = new EventArgs(
124 1
                [
125
                    'form' => $form,
126 1
                    'Member' => $Member,
127 1
                ],
128
                $request
129 1
            );
130
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_COMPLETE, $event);
131 1
132
            $this->addSuccess('admin.common.save_complete', 'admin');
133 1
134
            return $this->redirectToRoute('admin_setting_system_member_edit', ['id' => $Member->getId()]);
135 1
        }
136
137
        $this->tokenStorage->getToken()->setUser($LoginMember);
138 2
139
        return [
140
            'form' => $form->createView(),
141 2
            'Member' => $Member,
142 2
        ];
143
    }
144
145
    /**
146
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/edit", requirements={"id" = "\d+"}, name="admin_setting_system_member_edit")
147
     * @Template("@admin/Setting/System/member_edit.twig")
148
     */
149
    public function edit(Request $request, Member $Member)
150 3
    {
151
        $LoginMember = clone $this->tokenStorage->getToken()->getUser();
152 3
        $this->entityManager->detach($LoginMember);
153 3
154
        $previousPassword = $Member->getPassword();
155 3
        $Member->setPassword($this->eccubeConfig['eccube_default_password']);
156 3
157
        $builder = $this->formFactory
158 3
            ->createBuilder(MemberType::class, $Member);
159 3
160
        $event = new EventArgs(
161 3
            [
162
                'builder' => $builder,
163 3
                'Member' => $Member,
164 3
            ],
165
            $request
166 3
        );
167
        $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_INITIALIZE, $event);
168 3
169
        $form = $builder->getForm();
170 3
        $form->handleRequest($request);
171 3
172
        if ($form->isSubmitted() && $form->isValid()) {
173 3
            if ($Member->getpassword() === $this->eccubeConfig['eccube_default_password']) {
174 1
                // 編集時にパスワードを変更していなければ
175
                // 変更前のパスワード(暗号化済み)をセット
176
                $Member->setPassword($previousPassword);
177 1
            } else {
178
                $salt = $Member->getSalt();
179
                // 2系からのデータ移行でsaltがセットされていない場合はsaltを生成.
180
                if (empty($salt)) {
181
                    $salt = bin2hex(openssl_random_pseudo_bytes(5));
182
                    $Member->setSalt($salt);
183
                }
184
185
                $rawPassword = $Member->getPassword();
186
                $encoder = $this->encoderFactory->getEncoder($Member);
187
                $encodedPassword = $encoder->encodePassword($rawPassword, $salt);
188
                $Member->setPassword($encodedPassword);
189
            }
190
191
            $this->memberRepository->save($Member);
192 1
193
            $event = new EventArgs(
194 1
                [
195
                    'form' => $form,
196 1
                    'Member' => $Member,
197 1
                ],
198
                $request
199 1
            );
200
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_EDIT_COMPLETE, $event);
201 1
202
            $this->addSuccess('admin.common.save_complete', 'admin');
203 1
204
            return $this->redirectToRoute('admin_setting_system_member_edit', ['id' => $Member->getId()]);
205 1
        }
206
207
        $this->tokenStorage->getToken()->setUser($LoginMember);
208 2
209
        return [
210
            'form' => $form->createView(),
211 2
            'Member' => $Member,
212 2
        ];
213
    }
214
215
    /**
216
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/up", requirements={"id" = "\d+"}, name="admin_setting_system_member_up", methods={"PUT"})
217
     */
218 View Code Duplication
    public function up(Request $request, Member $Member)
0 ignored issues
show
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
219
    {
220 2
        $this->isTokenValid();
221
222 2
        try {
223
            $this->memberRepository->up($Member);
224
225 2
            $this->addSuccess('admin.common.move_complete', 'admin');
226
        } catch (\Exception $e) {
227 1
            log_error('メンバー表示順更新エラー', [$Member->getId(), $e]);
228 1
229 1
            $this->addError('admin.common.move_error', 'admin');
230
        }
231 1
232
        return $this->redirectToRoute('admin_setting_system_member');
233
    }
234 2
235
    /**
236
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/down", requirements={"id" = "\d+"}, name="admin_setting_system_member_down", methods={"PUT"})
237
     */
238 View Code Duplication
    public function down(Request $request, Member $Member)
0 ignored issues
show
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
239
    {
240
        $this->isTokenValid();
241 3
242
        try {
243 3
            $this->memberRepository->down($Member);
244
245
            $this->addSuccess('admin.common.move_complete', 'admin');
246 3
        } catch (\Exception $e) {
247
            log_error('メンバー表示順更新エラー', [$Member->getId(), $e]);
248 2
249 1
            $this->addError('admin.common.move_error', 'admin');
250 1
        }
251
252 1
        return $this->redirectToRoute('admin_setting_system_member');
253
    }
254
255 3
    /**
256
     * @Route("/%eccube_admin_route%/setting/system/member/{id}/delete", requirements={"id" = "\d+"}, name="admin_setting_system_member_delete", methods={"DELETE"})
257
     */
258
    public function delete(Request $request, Member $Member)
259
    {
260
        $this->isTokenValid();
261
262 1
        log_info('メンバー削除開始', [$Member->getId()]);
263
264 1
        try {
265
            $this->memberRepository->delete($Member);
266 1
267
            $event = new EventArgs(
268
                [
269 1
                    'Member' => $Member,
270
                ],
271 1
                $request
272
            );
273 1
            $this->eventDispatcher->dispatch(EccubeEvents::ADMIN_SETTING_SYSTEM_MEMBER_DELETE_COMPLETE, $event);
274
275 1
            $this->addSuccess('admin.common.delete_complete', 'admin');
276
277 1
            log_info('メンバー削除完了', [$Member->getId()]);
278
        } catch (ForeignKeyConstraintViolationException $e) {
279 1
            log_info('メンバー削除エラー', [$Member->getId()]);
280
281 1
            $message = trans('admin.common.delete_error_foreign_key', ['%name%' => $Member->getName()]);
282
            $this->addError($message, 'admin');
283
        } catch (\Exception $e) {
284
            log_info('メンバー削除エラー', [$Member->getId(), $e]);
285
286
            $message = trans('admin.common.delete_error');
287
            $this->addError($message, 'admin');
288
        }
289
290
        return $this->redirectToRoute('admin_setting_system_member');
291
    }
292
}
293