Completed
Pull Request — experimental/3.1 (#2479)
by chihiro
65:40 queued 24:05
created

EccubeServiceProvider   C

Complexity

Total Complexity 3

Size/Duplication

Total Lines 225
Duplicated Lines 7.56 %

Coupling/Cohesion

Components 0
Dependencies 35

Test Coverage

Coverage 60%

Importance

Changes 10
Bugs 0 Features 0
Metric Value
c 10
b 0
f 0
dl 17
loc 225
ccs 69
cts 115
cp 0.6
rs 5
wmc 3
lcom 0
cbo 35

2 Methods

Rating   Name   Duplication   Size   Complexity  
A subscribe() 0 7 1
B register() 17 206 2

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
/*
3
 * This file is part of EC-CUBE
4
 *
5
 * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved.
6
 *
7
 * http://www.lockon.co.jp/
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License
11
 * as published by the Free Software Foundation; either version 2
12
 * of the License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
 */
23
24
25
namespace Eccube\ServiceProvider;
26
27
use Doctrine\Common\Collections\ArrayCollection;
28
use Eccube\Entity\ItemHolderInterface;
29
use Eccube\EventListener\TransactionListener;
30
use Eccube\Repository\BaseInfoRepository;
31
use Eccube\Repository\DeliveryRepository;
32
use Eccube\Service\PurchaseFlow\Processor\AdminOrderRegisterPurchaseProcessor;
33
use Eccube\Service\PurchaseFlow\Processor\DeletedProductValidator;
34
use Eccube\Service\PurchaseFlow\Processor\DeliveryFeeFreeProcessor;
35
use Eccube\Service\PurchaseFlow\Processor\DeliveryFeeProcessor;
36
use Eccube\Service\PurchaseFlow\Processor\DeliverySettingValidator;
37
use Eccube\Service\PurchaseFlow\Processor\DisplayStatusValidator;
38
use Eccube\Service\PurchaseFlow\Processor\PaymentProcessor;
39
use Eccube\Service\PurchaseFlow\Processor\PaymentTotalLimitValidator;
40
use Eccube\Service\PurchaseFlow\Processor\PaymentTotalNegativeValidator;
41
use Eccube\Service\PurchaseFlow\Processor\SaleLimitValidator;
42
use Eccube\Service\PurchaseFlow\Processor\StockValidator;
43
use Eccube\Service\PurchaseFlow\Processor\UpdateDatePurchaseProcessor;
44
use Eccube\Service\PurchaseFlow\PurchaseContext;
45
use Eccube\Service\PurchaseFlow\PurchaseFlow;
46
use Eccube\Service\TaxRuleService;
47
use Pimple\Container;
48
use Pimple\ServiceProviderInterface;
49
use Silex\Api\EventListenerProviderInterface;
50
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
51
use Symfony\Component\HttpFoundation\ParameterBag;
52
53
class EccubeServiceProvider implements ServiceProviderInterface, EventListenerProviderInterface
0 ignored issues
show
introduced by
Missing class doc comment
Loading history...
54
{
55
    /**
56
     * Registers services on the given app.
57
     *
58
     * This method should only be used to configure services and parameters.
59
     * It should not get services.
60
     *
61
     * @param BaseApplication $app An Application instance
62
     */
63 1104
    public function register(Container $app)
64
    {
65
        $app['eccube.calculate.context'] = function () use ($app) {
66
                return new \Eccube\Service\Calculator\CalculateContext();
67
        };
68
69
        $app['eccube.calculate.strategies'] = function () use ($app) {
70
            $Collection = new \Eccube\Service\Calculator\CalculateStrategyCollection();
71
            $Collection->setApplication($app);
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
72
            //$Collection->setOrder($Order);
73
            // デフォルトのストラテジーをセットしておく
74
            $Collection->add($app['eccube.calculate.strategy.shipping']);
75
            $Collection->add($app['eccube.calculate.strategy.charge']);
76
            $Collection->add($app['eccube.calculate.strategy.tax']);
77
            $Collection->add($app['eccube.calculate.strategy.calculate_delivery_fee']);
78
            $Collection->add($app['eccube.calculate.strategy.calculate_charge']);
79
            $Collection->add($app['eccube.calculate.strategy.calculate_total']);
80
            return $Collection;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
81
        };
82
        $app['eccube.calculate.strategy.shipping'] = function () use ($app) {
83
                $Strategy = new \Eccube\Service\Calculator\Strategy\ShippingStrategy();
84
                $Strategy->setApplication($app);
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
85
                return $Strategy;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
86
        };
87
        $app['eccube.calculate.strategy.charge'] = function () use ($app) {
88
                $Strategy = new \Eccube\Service\Calculator\Strategy\ChargeStrategy();
89
                $Strategy->setApplication($app);
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
90
                return $Strategy;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
91
        };
92
93
        $app['eccube.calculate.strategy.tax'] = function () use ($app) {
94
                $Strategy = new \Eccube\Service\Calculator\Strategy\TaxStrategy();
95
                $Strategy->setApplication($app);
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
96
                return $Strategy;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
97
        };
98
99
        $app['eccube.calculate.strategy.calculate_delivery_fee'] = function () use ($app) {
100
            $Strategy = new \Eccube\Service\Calculator\Strategy\CalculateDeliveryFeeStrategy();
101
            $Strategy->setApplication($app);
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
102
            return $Strategy;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
103
        };
104
        $app['eccube.calculate.strategy.calculate_charge'] = function () use ($app) {
105
            $Strategy = new \Eccube\Service\Calculator\Strategy\CalculateChargeStrategy();
106
            $Strategy->setApplication($app);
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
107
            return $Strategy;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
108
        };
109
        $app['eccube.calculate.strategy.calculate_total'] = function () use ($app) {
110
            $Strategy = new \Eccube\Service\Calculator\Strategy\CalculateTotalStrategy();
111
            $Strategy->setApplication($app);
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
112
            return $Strategy;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
113
        };
114
115
        $app['payment.method'] = $app->protect(function ($clazz, $form) use ($app) {
116 1
                $PaymentMethod = new $clazz;
0 ignored issues
show
introduced by
Use parentheses when instantiating classes
Loading history...
117 1
                $PaymentMethod->setApplication($app);
118 1
                $PaymentMethod->setFormType($form);
119 1
                return $PaymentMethod;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
120 1104
        });
121
122
        $app['payment.method.request'] = $app->protect(function ($clazz, $form, $request) use ($app) {
123 2
                $PaymentMethod = new $clazz;
0 ignored issues
show
introduced by
Use parentheses when instantiating classes
Loading history...
124 2
                $PaymentMethod->setApplication($app);
125 2
                $PaymentMethod->setFormType($form);
126 2
                $PaymentMethod->setRequest($request);
127 2
                return $PaymentMethod;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
128 1104
        });
129
130
        $app['eccube.service.calculate'] = $app->protect(function ($Order, $Customer) use ($app) {
131
            $Service = new \Eccube\Service\CalculateService($Order, $Customer);
132
            $Context = $app['eccube.calculate.context'];
133
            $app['eccube.calculate.strategies']->setOrder($Order);
134
            $Context->setCalculateStrategies($app['eccube.calculate.strategies']);
135
            $Context->setOrder($Order);
136
            $Service->setContext($Context);
137
138
            return $Service;
139 1104
        });
140
141
        $app['eccube.service.payment'] = $app->protect(function ($clazz) use ($app) {
142 3
            $Service = new $clazz($app['request_stack']);
143
144 3
            return $Service;
145 1104
        });
146
147
        $app['paginator'] = $app->protect(function () {
148 29
            $paginator = new \Knp\Component\Pager\Paginator();
149 29
            $paginator->subscribe(new \Eccube\EventListener\PaginatorListener());
150
151 29
            return $paginator;
152 1104
        });
153
154
        $app['request_scope'] = function () {
155 21
            return new ParameterBag();
156
        };
157
        // TODO 使用するか検討
158
        $app['eccube.twig.node.hello'] = $app->protect(function ($node, $compiler) {
159
            $compiler
160
            ->addDebugInfo($node)
161
            ->write("echo 'Helloooooo ' . ")
162
            ->subcompile($node->getNode('expr'))
163
            ->raw(" . '!';\n")
164
            ;
165
166 1104
        });
167
        // TODO 使用するか検討
168
        $app['eccube.twig.node.jiro'] = $app->protect(function ($node, $compiler) {
169
            $compiler
170
            ->addDebugInfo($node)
171
            ->write("echo 'jirooooooo ' . ")
172
            ->subcompile($node->getNode('expr'))
173
            ->raw(" . '!';\n")
174
            ;
175
176 1104
        });
177
178
        // TODO 使用するか検討
179
        $app['eccube.twig.generic_node_names'] = function () use ($app) {
180
            return [
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
181 116
                'hello',
182
                'jiro',
183
                'bbb'
184
            ];
185
        };
186
187
        // TODO 使用するか検討
188
        $app['twig_parsers'] = function () use ($app) {
189 116
            $GenericTokenParsers = [];
190 116
            foreach ($app['eccube.twig.generic_node_names'] as $tagName) {
191 116
                $GenericTokenParsers[] = new \Eccube\Twig\Extension\GenericTokenParser($app, $tagName);
192
            }
193 116
            return $GenericTokenParsers;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
194
        };
195
196
        $app['eccube.twig.block.templates'] = function () {
197
            $templates = new ArrayCollection();
198
            $templates[] = 'render_block.twig';
199
200
            return $templates;
201
        };
202
203 1104
        $app['eccube.entity.event.dispatcher']->addEventListener(new \Acme\Entity\SoldOutEventListener());
204
        $app['eccube.queries'] = function () {
205 1104
            return new \Eccube\Doctrine\Query\Queries();
206
        };
207
        // TODO QueryCustomizerの追加方法は要検討
208 1104
        $app['eccube.queries']->addCustomizer(new \Acme\Entity\AdminProductListCustomizer());
209
210
        $app['eccube.purchase.context'] = $app->protect(function (ItemHolderInterface $origin = null) {
211 17
            return new PurchaseContext($origin);
212 1104
        });
213
214
        $app['eccube.purchase.flow.cart.item_processors'] = function ($app) {
215 24
            $processors = new ArrayCollection();
216 24
            $processors->add(new DeletedProductValidator());
217 24
            $processors->add(new DisplayStatusValidator());
218 24
            $processors->add(new SaleLimitValidator());
219 24
            $processors->add(new DeliverySettingValidator($app['eccube.repository.delivery']));
220
221 24
            return $processors;
222
        };
223
224
        $app['eccube.purchase.flow.cart.holder_processors'] = function ($app) {
225 24
            $processors = new ArrayCollection();
226 24
            $processors->add(new PaymentProcessor($app[DeliveryRepository::class]));
227 24
            $processors->add(new PaymentTotalLimitValidator($app['config']['max_total_fee']));
228 24
            $processors->add(new DeliveryFeeFreeProcessor($app[BaseInfoRepository::class]));
229 24
            $processors->add(new PaymentTotalNegativeValidator());
230
231 24
            return $processors;
232
        };
233
234
        // example
235
        $app->extend('eccube.purchase.flow.cart.item_processors', function ($processors, $app) {
0 ignored issues
show
Unused Code introduced by
The parameter $app 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...
236
237 24
            $processors->add(new StockValidator());
238
239 24
            return $processors;
240 1104
        });
241
242
        $app['eccube.purchase.flow.cart'] = function ($app) {
243 24
            $flow = new PurchaseFlow();
244 24
            $flow->setItemProcessors($app['eccube.purchase.flow.cart.item_processors']);
245 24
            $flow->setItemHolderProcessors($app['eccube.purchase.flow.cart.holder_processors']);
246
247 24
            return $flow;
248
        };
249
250 View Code Duplication
        $app['eccube.purchase.flow.shopping'] = function () use ($app) {
251 21
            $flow = new PurchaseFlow();
252 21
            $flow->addItemProcessor(new StockValidator());
253 21
            $flow->addItemProcessor(new DisplayStatusValidator());
254 21
            $flow->addItemHolderProcessor(new PaymentTotalLimitValidator($app['config']['max_total_fee']));
255 21
            $flow->addItemHolderProcessor(new DeliveryFeeProcessor($app['orm.em']));
256 21
            $flow->addItemHolderProcessor(new PaymentTotalNegativeValidator());
257 21
            return $flow;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
258
        };
259
260 8 View Code Duplication
        $app['eccube.purchase.flow.order'] = function () use ($app) {
261 8
            $flow = new PurchaseFlow();
262 8
            $flow->addItemProcessor(new StockValidator());
263 8
            $flow->addItemHolderProcessor(new PaymentTotalLimitValidator($app['config']['max_total_fee']));
264 8
            $flow->addPurchaseProcessor(new UpdateDatePurchaseProcessor($app['config']));
265 8
            $flow->addPurchaseProcessor(new AdminOrderRegisterPurchaseProcessor($app));
0 ignored issues
show
Unused Code introduced by
The call to AdminOrderRegisterPurchaseProcessor::__construct() has too many arguments starting with $app.

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
266 8
            return $flow;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
267
        };
268
    }
269
270 1104
    public function subscribe(Container $app, EventDispatcherInterface $dispatcher)
0 ignored issues
show
introduced by
Missing function doc comment
Loading history...
271
    {
272
        // Add event subscriber to TaxRuleEvent
273 1104
        $app['orm.em']->getEventManager()->addEventSubscriber(new \Eccube\Doctrine\EventSubscriber\TaxRuleEventSubscriber($app[TaxRuleService::class]));
274
275 1104
        $dispatcher->addSubscriber(new TransactionListener($app));
0 ignored issues
show
Compatibility introduced by
$app of type object<Pimple\Container> is not a sub-type of object<Eccube\Application>. It seems like you assume a child class of the class Pimple\Container to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
276
    }
277
}
278