forked from Yoast/wordpress-seo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathabstract-main.php
120 lines (104 loc) · 2.69 KB
/
abstract-main.php
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
<?php
namespace Yoast\WP\Lib;
use Exception;
use Yoast\WP\Lib\Dependency_Injection\Container_Registry;
use Yoast\WP\SEO\Loader;
use YoastSEO_Vendor\Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Abstract class to extend for the main class in a plugin.
*/
abstract class Abstract_Main {
/**
* The DI container.
*
* @var ContainerInterface|null
*/
protected $container;
/**
* Loads the plugin.
*
* @throws Exception If loading fails and YOAST_ENVIRONMENT is development.
*/
public function load() {
if ( $this->container ) {
return;
}
try {
$this->container = $this->get_container();
Container_Registry::register( $this->get_name(), $this->container );
if ( ! $this->container ) {
return;
}
if ( ! $this->container->has( Loader::class ) ) {
return;
}
$this->container->get( Loader::class )->load();
} catch ( Exception $e ) {
if ( $this->is_development() ) {
throw $e;
}
// Don't crash the entire site, simply don't load.
}
}
/**
* Magic getter for retrieving a property.
*
* @param string $property The property to retrieve.
*
* @return string The value of the property.
*
* @throws Exception When the property doesn't exist.
*/
public function __get( $property ) {
$surfaces = $this->get_surfaces();
if ( isset( $surfaces[ $property ] ) ) {
$this->{$property} = $this->container->get( $surfaces[ $property ] );
return $this->{$property};
}
throw new Exception( "Property $property does not exist." );
}
/**
* Checks if the given property exists as a surface.
*
* @param string $property The property to retrieve.
*
* @return bool True when property is set.
*/
public function __isset( $property ) {
return isset( $this->surfaces[ $property ] );
}
/**
* Loads the DI container.
*
* @return ContainerInterface|null The DI container.
*
* @throws Exception If something goes wrong generating the DI container.
*/
abstract protected function get_container();
/**
* Gets the name of the plugin.
*
* @return string The name.
*/
abstract protected function get_name();
/**
* Gets the surfaces of this plugin.
*
* @return array A mapping of surface name to the responsible class.
*/
abstract protected function get_surfaces();
/**
* Returns whether or not we're in an environment for Yoast development.
*
* @return bool Whether or not to load in development mode.
*/
protected function is_development() {
try {
return \WPSEO_Utils::is_development_mode();
}
catch ( \Exception $exception ) {
// E.g. when WordPress and/or WordPress SEO are not loaded.
return \defined( 'YOAST_ENVIRONMENT' ) && \YOAST_ENVIRONMENT === 'development';
}
}
}