Completed
Push — master ( 8e6257...5be18b )
by ARCANEDEV
12s
created

Sitemap::make()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php namespace Arcanedev\LaravelSitemap\Entities;
2
3
use Arcanedev\LaravelSitemap\Contracts\Entities\Sitemap as SitemapContract;
4
use Illuminate\Support\Collection;
5
use Arcanedev\LaravelSitemap\Contracts\Entities\Url as UrlContract;
6
7
/**
8
 * Class     Sitemap
9
 *
10
 * @package  Arcanedev\LaravelSitemap\Entities
11
 * @author   ARCANEDEV <[email protected]>
12
 */
13
class Sitemap implements SitemapContract
14
{
15
    /* -----------------------------------------------------------------
16
     |  Properties
17
     | -----------------------------------------------------------------
18
     */
19
20
    /** @var string|null */
21
    protected $path;
22
23
    /** @var  \Illuminate\Support\Collection */
24
    protected $urls;
25
26
    /* -----------------------------------------------------------------
27
     |  Constructor
28
     | -----------------------------------------------------------------
29
     */
30
31
    /**
32
     * Sitemap constructor.
33
     */
34 56
    public function __construct()
35
    {
36 56
        $this->urls = new Collection;
37 56
    }
38
39
    /* -----------------------------------------------------------------
40
     |  Getters & Setters
41
     | -----------------------------------------------------------------
42
     */
43
44
    /**
45
     * Set the sitemap path.
46
     *
47
     * @param  string  $path
48
     *
49
     * @return self
50
     */
51 32
    public function setPath($path)
52
    {
53 32
        $this->path = $path;
54
55 32
        return $this;
56
    }
57
58
    /**
59
     * Get the sitemap path.
60
     *
61
     * @return string|null
62
     */
63 14
    public function getPath()
64
    {
65 14
        return $this->path;
66
    }
67
68
    /**
69
     * Get the sitemap's URLs.
70
     *
71
     * @return \Illuminate\Support\Collection
72
     */
73 36
    public function getUrls()
74
    {
75 36
        return $this->urls;
76
    }
77
78
    /**
79
     * Set the URLs Collection.
80
     *
81
     * @param  \Illuminate\Support\Collection  $urls
82
     *
83
     * @return self
84
     */
85 6
    public function setUrls(Collection $urls)
86
    {
87 6
        $this->urls = $urls;
88
89 6
        return $this;
90
    }
91
92
    /* -----------------------------------------------------------------
93
     |  Main Methods
94
     | -----------------------------------------------------------------
95
     */
96
97
    /**
98
     * Make a sitemap instance.
99
     *
100
     * @return self
101
     */
102 4
    public static function make()
103
    {
104 4
        return new static();
105
    }
106
107
    /**
108
     * Get a URL instance by its loc.
109
     *
110
     * @param  string      $loc
111
     * @param  mixed|null  $default
112
     *
113
     * @return \Arcanedev\LaravelSitemap\Entities\Url|null
114
     */
115 2
    public function getUrl($loc, $default = null)
116
    {
117 2
        return $this->getUrls()->get($loc, $default);
118
    }
119
120
    /**
121
     * Add a sitemap URL to the collection.
122
     *
123
     * @param  \Arcanedev\LaravelSitemap\Contracts\Entities\Url  $url
124
     *
125
     * @return $this
126
     */
127 48
    public function add(UrlContract $url)
128
    {
129 48
        $this->urls->put($url->getLoc(), $url);
130
131 48
        return $this;
132
    }
133
134
    /**
135
     * Add many urls to the collection.
136
     *
137
     * @param  array|\Illuminate\Support\Collection  $urls
138
     *
139
     * @return self
140
     */
141 2
    public function addMany($urls)
142
    {
143 2
        foreach ($urls as $url) {
144 2
            $this->add($url);
145
        }
146
147 2
        return $this;
148
    }
149
150
    /**
151
     * Create and Add a sitemap URL to the collection.
152
     *
153
     * @param  string    $loc
154
     * @param  callable  $callback
155
     *
156
     * @return self
157
     */
158 30
    public function create($loc, callable $callback)
159
    {
160 30
        return $this->add(tap(Url::make($loc), $callback));
161
    }
162
163
    /**
164
     * Check if the url exists in the sitemap items.
165
     *
166
     * @param  string  $url
167
     *
168
     * @return bool
169
     */
170 4
    public function has($url)
171
    {
172 4
        return $this->urls->has($url);
173
    }
174
175
    /**
176
     * Get the urls' count.
177
     *
178
     * @return int
179
     */
180 36
    public function count()
181
    {
182 36
        return $this->urls->count();
183
    }
184
185
    /**
186
     * Get the collection of items as a plain array.
187
     *
188
     * @return array
189
     */
190 12
    public function toArray()
191
    {
192 12
        return $this->getUrls()->values()->toArray();
193
    }
194
195
    /**
196
     * Get the sitemap and its urls as JSON.
197
     *
198
     * @param  int  $options
199
     *
200
     * @return string
201
     */
202 2
    public function toJson($options = 0)
203
    {
204 2
        return json_encode($this->jsonSerialize(), $options);
205
    }
206
207
    /**
208
     * Convert the object into something JSON serializable.
209
     *
210
     * @return array
211
     */
212 2
    public function jsonSerialize()
213
    {
214 2
        return $this->toArray();
215
    }
216
217
    /**
218
     * Check if the number of URLs is exceeded.
219
     *
220
     * @return bool
221
     */
222 22
    public function isExceeded()
223
    {
224 22
        return $this->count() > $this->getMaxSize();
225
    }
226
227
    /**
228
     * Chunk the sitemap to multiple chunks if the size is exceeded.
229
     *
230
     * @return \Illuminate\Support\Collection
231
     */
232
    public function chunk()
233
    {
234 4
        return $this->urls->chunk($this->getMaxSize())->mapWithKeys(function ($item, $index) {
235 4
            $pathInfo = pathinfo($this->getPath());
236 4
            $index    = $index + 1;
237 4
            $path     = $pathInfo['dirname'].'/'.$pathInfo['filename'].'-'.$index.'.'.$pathInfo['extension'];
238
239 4
            return [$index => (new Sitemap)->setPath($path)->setUrls($item)];
240 4
        });
241
    }
242
243
    /* -----------------------------------------------------------------
244
     |  Other Methods
245
     | -----------------------------------------------------------------
246
     */
247
248
    /**
249
     * Get the max size.
250
     *
251
     * @return int
252
     */
253 22
    protected function getMaxSize()
254
    {
255 22
        return config('sitemap.urls-max-size', 50000);
256
    }
257
}
258