Completed
Push — master ( baf592...2ff1b0 )
by ARCANEDEV
08:53
created

LaravelTrackerServiceProvider::getModelsBindings()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 22
c 0
b 0
f 0
ccs 19
cts 19
cp 1
rs 9.2
cc 1
eloc 19
nc 1
nop 0
crap 1
1
<?php namespace Arcanedev\LaravelTracker;
2
3
use Arcanedev\Support\PackageServiceProvider;
4
use Arcanedev\LaravelTracker\Contracts\Trackers as TrackerContracts;
5
use Illuminate\Contracts\Debug\ExceptionHandler as ExceptionHandlerContract;
6
use Illuminate\Contracts\Foundation\Application as AppContract;
7
8
/**
9
 * Class     LaravelTrackerServiceProvider
10
 *
11
 * @package  Arcanedev\LaravelTracker
12
 * @author   ARCANEDEV <[email protected]>
13
 */
14
class LaravelTrackerServiceProvider extends PackageServiceProvider
15
{
16
    /* ------------------------------------------------------------------------------------------------
17
     |  Properties
18
     | ------------------------------------------------------------------------------------------------
19
     */
20
    /**
21
     * Package name.
22
     *
23
     * @var string
24
     */
25
    protected $package = 'laravel-tracker';
26
27
    /* ------------------------------------------------------------------------------------------------
28
     |  Getters & Setters
29
     | ------------------------------------------------------------------------------------------------
30
     */
31
    /**
32
     * Get the base path of the package.
33
     *
34
     * @return string
35
     */
36 234
    public function getBasePath()
37
    {
38 234
        return dirname(__DIR__);
39
    }
40
41
    /* ------------------------------------------------------------------------------------------------
42
     |  Main Functions
43
     | ------------------------------------------------------------------------------------------------
44
     */
45
    /**
46
     * Register the service provider.
47
     */
48 234
    public function register()
49
    {
50 234
        $this->registerConfig();
51 234
        $this->bindModels();
52
53 234
        $this->app->register(Providers\PackagesServiceProvider::class);
54 234
        $this->app->register(Providers\EventServiceProvider::class);
55
56 234
        if ($this->app->runningInConsole())
57 234
            $this->app->register(Providers\CommandServiceProvider::class);
58
59 234
        $this->registerDetectors();
60 234
        $this->registerParsers();
61 234
        $this->registerTrackers();
62 234
        $this->registerMainTracker();
63 234
        $this->registerExceptionHandler();
64 234
    }
65
66
    /**
67
     * Boot the service provider.
68
     */
69 234
    public function boot()
70
    {
71 234
        parent::boot();
72
73 234
        $this->publishConfig();
74 234
        $this->publishMigrations();
75 234
    }
76
77
    /**
78
     * Get the services provided by the provider.
79
     *
80
     * @return array
81
     */
82 6
    public function provides()
83
    {
84
        return [
85 6
            'arcanedev.tracker',
86 3
            Contracts\Tracker::class,
87 3
        ];
88
    }
89
90
    /* ------------------------------------------------------------------------------------------------
91
     |  Other Functions
92
     | ------------------------------------------------------------------------------------------------
93
     */
94
    /**
95
     * Binding the models with the contracts.
96
     */
97 234
    private function bindModels()
98
    {
99 234
        foreach ($this->getModelsBindings() as $key => $contract) {
100 234
            $this->bind($contract, $this->config()->get("laravel-tracker.models.$key"));
101 117
        }
102 234
    }
103
104
    /**
105
     * Register the detectors.
106
     */
107 234
    private function registerDetectors()
108
    {
109
        $this->singleton(Contracts\Detectors\CrawlerDetector::class, function (AppContract $app) {
110
            /** @var \Illuminate\Http\Request $request */
111 12
            $request = $app['request'];
112 12
            $crawler = new \Jaybizzle\CrawlerDetect\CrawlerDetect(
113 12
                $request->headers->all(),
114 12
                $request->server('HTTP_USER_AGENT')
115 6
            );
116
117 12
            return new Detectors\CrawlerDetector($crawler);
118 234
        });
119
120
        $this->singleton(Contracts\Detectors\DeviceDetector::class, function (AppContract $app) {
121 18
            return new Detectors\DeviceDetector($app['agent']);
122 234
        });
123
124 234
        $this->singleton(Contracts\Detectors\GeoIpDetector::class, Detectors\GeoIpDetector::class);
125
126
        $this->singleton(Contracts\Detectors\LanguageDetector::class, function (AppContract $app) {
127 18
            return new Detectors\LanguageDetector($app['agent']);
128 234
        });
129 234
    }
130
131
    /**
132
     * Register the parsers.
133
     */
134 234
    private function registerParsers()
135
    {
136
        $this->singleton(Contracts\Parsers\RefererParser::class, function () {
137 18
            return new Parsers\RefererParser(
138 9
                new \Snowplow\RefererParser\Parser
139 9
            );
140 234
        });
141
142
        $this->singleton(Contracts\Parsers\UserAgentParser::class, function (AppContract $app) {
143 30
            return new Parsers\UserAgentParser(
144 30
                \UAParser\Parser::create(),
145 30
                $app->make('path.base')
146 15
            );
147 234
        });
148 234
    }
149
150
    /**
151
     * Register the trackers.
152
     */
153 234
    private function registerTrackers()
154
    {
155 234
        foreach ($this->getTrackersBindings() as $abstract => $concrete) {
156 234
            $this->singleton($abstract, $concrete);
157 117
        }
158 234
    }
159
160
    /**
161
     * Register the main tracker.
162
     */
163 234
    private function registerMainTracker()
164
    {
165 234
        $this->singleton(Contracts\Tracker::class, Tracker::class);
166 234
        $this->singleton('arcanedev.tracker', Contracts\Tracker::class);
167 234
    }
168
169
    /**
170
     * Register the exception handler.
171
     */
172 234
    private function registerExceptionHandler()
173
    {
174 234
        $handler = $this->app[ExceptionHandlerContract::class];
175
176 234
        $this->app->singleton(ExceptionHandlerContract::class, function ($app) use ($handler) {
177 234
            return new Exceptions\Handler($app[Contracts\Tracker::class], $handler);
178 234
        });
179 234
    }
180
181
    /**
182
     * Get the models bindings.
183
     *
184
     * @return array
185
     */
186 234
    private function getModelsBindings()
187
    {
188
        return [
189 234
            Models\AbstractModel::MODEL_AGENT                => Contracts\Models\Agent::class,
190 234
            Models\AbstractModel::MODEL_COOKIE               => Contracts\Models\Cookie::class,
191 234
            Models\AbstractModel::MODEL_DEVICE               => Contracts\Models\Device::class,
192 234
            Models\AbstractModel::MODEL_DOMAIN               => Contracts\Models\Domain::class,
193 234
            Models\AbstractModel::MODEL_ERROR                => Contracts\Models\Error::class,
194 234
            Models\AbstractModel::MODEL_GEOIP                => Contracts\Models\GeoIp::class,
195 234
            Models\AbstractModel::MODEL_LANGUAGE             => Contracts\Models\Language::class,
196 234
            Models\AbstractModel::MODEL_PATH                 => Contracts\Models\Path::class,
197 234
            Models\AbstractModel::MODEL_QUERY                => Contracts\Models\Query::class,
198 234
            Models\AbstractModel::MODEL_REFERER              => Contracts\Models\Referer::class,
199 234
            Models\AbstractModel::MODEL_REFERER_SEARCH_TERM  => Contracts\Models\RefererSearchTerm::class,
200 234
            Models\AbstractModel::MODEL_ROUTE                => Contracts\Models\Route::class,
201 234
            Models\AbstractModel::MODEL_ROUTE_PATH           => Contracts\Models\RoutePath::class,
202 234
            Models\AbstractModel::MODEL_ROUTE_PATH_PARAMETER => Contracts\Models\RoutePathParameter::class,
203 234
            Models\AbstractModel::MODEL_SESSION              => Contracts\Models\Session::class,
204 234
            Models\AbstractModel::MODEL_SESSION_ACTIVITY     => Contracts\Models\SessionActivity::class,
205 234
            Models\AbstractModel::MODEL_USER                 => Contracts\Models\User::class,
206 117
        ];
207
    }
208
209
    /**
210
     * Get the trackers bindings.
211
     *
212
     * @return array
213
     */
214 234
    private function getTrackersBindings()
215
    {
216
        return [
217 234
            TrackerContracts\CookieTracker::class          => Trackers\CookieTracker::class,
218 117
            TrackerContracts\DeviceTracker::class          => Trackers\DeviceTracker::class,
219 117
            TrackerContracts\ErrorTracker::class           => Trackers\ErrorTracker::class,
220 117
            TrackerContracts\GeoIpTracker::class           => Trackers\GeoIpTracker::class,
221 117
            TrackerContracts\LanguageTracker::class        => Trackers\LanguageTracker::class,
222 117
            TrackerContracts\PathTracker::class            => Trackers\PathTracker::class,
223 117
            TrackerContracts\QueryTracker::class           => Trackers\QueryTracker::class,
224 117
            TrackerContracts\RefererTracker::class         => Trackers\RefererTracker::class,
225 117
            TrackerContracts\RouteTracker::class           => Trackers\RouteTracker::class,
226 117
            TrackerContracts\SessionTracker::class         => Trackers\SessionTracker::class,
227 117
            TrackerContracts\SessionActivityTracker::class => Trackers\SessionActivityTracker::class,
228 117
            TrackerContracts\UserAgentTracker::class       => Trackers\UserAgentTracker::class,
229 117
            TrackerContracts\UserTracker::class            => Trackers\UserTracker::class,
230 117
        ];
231
    }
232
}
233