Completed
Push — master ( 086d51...184cf7 )
by ARCANEDEV
12s
created

Sitemap::toArray()   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 54
    public function __construct()
35
    {
36 54
        $this->urls = new Collection;
37 54
    }
38
39
    /* -----------------------------------------------------------------
40
     |  Main Methods
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
     * Get a URL instance by its loc.
94
     *
95
     * @param  string      $loc
96
     * @param  mixed|null  $default
97
     *
98
     * @return \Arcanedev\LaravelSitemap\Entities\Url|null
99
     */
100 2
    public function getUrl($loc, $default = null)
101
    {
102 2
        return $this->getUrls()->get($loc, $default);
103
    }
104
105
    /**
106
     * Add a sitemap URL to the collection.
107
     *
108
     * @param  \Arcanedev\LaravelSitemap\Contracts\Entities\Url  $url
109
     *
110
     * @return $this
111
     */
112 48
    public function add(UrlContract $url)
113
    {
114 48
        $this->urls->put($url->getLoc(), $url);
115
116 48
        return $this;
117
    }
118
119
    /**
120
     * Add many urls to the collection.
121
     *
122
     * @param  array|\Illuminate\Support\Collection  $urls
123
     *
124
     * @return self
125
     */
126 2
    public function addMany($urls)
127
    {
128 2
        foreach ($urls as $url) { $this->add($url); }
129
130 2
        return $this;
131
    }
132
133
    /**
134
     * Create and Add a sitemap URL to the collection.
135
     *
136
     * @param  string    $loc
137
     * @param  callable  $callback
138
     *
139
     * @return self
140
     */
141 30
    public function create($loc, callable $callback)
142
    {
143 30
        return $this->add(tap(Url::make($loc), $callback));
144
    }
145
146
    /**
147
     * Check if the url exists in the sitemap items.
148
     *
149
     * @param  string  $url
150
     *
151
     * @return bool
152
     */
153 4
    public function has($url)
154
    {
155 4
        return $this->urls->has($url);
156
    }
157
158
    /**
159
     * Get the urls' count.
160
     *
161
     * @return int
162
     */
163 34
    public function count()
164
    {
165 34
        return $this->urls->count();
166
    }
167
168
    /**
169
     * Get the collection of items as a plain array.
170
     *
171
     * @return array
172
     */
173 12
    public function toArray()
174
    {
175 12
        return $this->getUrls()->values()->toArray();
176
    }
177
178
    /**
179
     * Get the sitemap and its urls as JSON.
180
     *
181
     * @param  int  $options
182
     *
183
     * @return string
184
     */
185 2
    public function toJson($options = 0)
186
    {
187 2
        return json_encode($this->jsonSerialize(), $options);
188
    }
189
190
    /**
191
     * Convert the object into something JSON serializable.
192
     *
193
     * @return array
194
     */
195 2
    public function jsonSerialize()
196
    {
197 2
        return $this->toArray();
198
    }
199
200
    /**
201
     * Check if the number of URLs is exceeded.
202
     *
203
     * @return bool
204
     */
205 22
    public function isExceeded()
206
    {
207 22
        return $this->count() > $this->getMaxSize();
208
    }
209
210
    /**
211
     * Chunk the sitemap to multiple chunks.
212
     *
213
     * @return \Illuminate\Support\Collection
214
     */
215
    public function chunk()
216
    {
217 4
        return $this->urls->chunk($this->getMaxSize())->mapWithKeys(function ($item, $index) {
218 4
            $pathInfo = pathinfo($this->getPath());
219 4
            $index    = $index + 1;
220 4
            $path     = $pathInfo['dirname'].'/'.$pathInfo['filename'].'-'.$index.'.'.$pathInfo['extension'];
221
222 4
            return [$index => (new Sitemap)->setPath($path)->setUrls($item)];
223 4
        });
224
    }
225
226
    /* -----------------------------------------------------------------
227
     |  Other Methods
228
     | -----------------------------------------------------------------
229
     */
230
231 22
    protected function getMaxSize()
232
    {
233 22
        return config('sitemap.urls-max-size', 50000);
234
    }
235
}
236