-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDispatcher.php
More file actions
147 lines (123 loc) · 2.98 KB
/
Copy pathDispatcher.php
File metadata and controls
147 lines (123 loc) · 2.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<?php namespace Feather\Extensions;
use FilesystemIterator;
use Illuminate\Container;
use Illuminate\Filesystem;
use Feather\Models\Extension as ExtensionModel;
class Dispatcher extends Container {
/**
* Laravel application instance.
*
* @var Illuminate\Foundation\Application
*/
protected $app;
/**
* Filesystem instance.
*
* @var Illuminate\Filesystem
*/
protected $files;
/**
* Path to extensions directory.
*
* @var string
*/
protected $path;
/**
* Started extensions.
*
* @var array
*/
protected $started = array();
/**
* Create a new dispatcher instance.
*
* @param Illuminate\Filesystem $files
* @param string $path
* @return void
*/
public function __construct(Filesystem $files, $path)
{
$this->files = $files;
$this->path = $path;
}
/**
* Set the Laravel application instance.
*
* @param Illuminate\Container $app
* @return void
*/
public function setApplication(Container $app)
{
$this->app = $app;
}
/**
* Register an array of extensions with the dispatcher.
*
* @param array $extensions
* @return void
*/
public function registerExtensions($extensions)
{
foreach ($extensions as $extension)
{
$this->register($extension);
}
}
/**
* Register an extension with the dispatcher.
*
* @param Feather\Models\Extension $extension
* @return void
*/
public function register(ExtensionModel $extension)
{
$path = $this->path.'/'.$extension->location;
if ($this->files->exists($path))
{
$extension->path = $path;
$extension->loaded = array();
$this["extension.{$extension->identifier}"] = $extension;
// If an extension is set to be automatically started then we'll hand it off to
// the starting method.
if ($extension->auto)
{
$this->start($extension->identifier);
}
}
}
/**
* Start an extension.
*
* @param string $extension
* @return void
*/
public function start($extension)
{
if (in_array($extension, $this->started) or ! isset($this["extension.{$extension}"]))
{
return;
}
$extension = $this["extension.{$extension}"];
foreach (new FilesystemIterator($extension->path) as $file)
{
$name = $file->getBasename(".{$file->getExtension()}");
if (ends_with($name, 'Extension'))
{
$location = str_replace('/', '\\', $extension->location);
$class = "Feather\\Extensions\\{$location}\\{$name}";
// Instantiate the new extension class and assign it to the extensions loaded classes. The class
// receives an instance of the Laravel application.
$extension->loaded = array_merge($extension->loaded, array($class => new $class($this->app)));
// If the extension has the start method we'll fire it, this is a great place for extensions
// to do any bootstrapping or listening to events without having to override the constructor.
if (method_exists($extension->loaded[$class], 'start'))
{
$extension->loaded[$class]->start($this->app);
}
}
}
}
public function fire()
{
}
}