Skip to content
Snippets Groups Projects
Commit b392d25b authored by Grzegorz Rola's avatar Grzegorz Rola
Browse files

Merge branch 'feature/builder-pattern' into 'devel'

more like builder pattern

See merge request !4
parents cf3162b5 fee9e366
No related branches found
No related tags found
2 merge requests!5Devel,!4more like builder pattern
<?php
namespace WPDesk\PluginBuilder\BuildDirector;
use WPDesk\PluginBuilder\Builder\AbstractBuilder;
use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
use WPDesk\PluginBuilder\Storage\StorageFactory;
class LegacyBuildDirector {
/** @var AbstractBuilder */
private $builder;
public function __construct( AbstractBuilder $builder ) {
$this->builder = $builder;
}
/**
* Builds plugin
*/
public function build_plugin() {
$this->builder->build_plugin();
$this->builder->init_plugin();
$storage = new StorageFactory();
$this->builder->store_plugin( $storage->create_storage() );
}
/**
* Returns built plugin
*
* @return AbstractPlugin
*/
public function get_plugin() {
return $this->builder->get_plugin();
}
}
\ No newline at end of file
...@@ -3,31 +3,62 @@ ...@@ -3,31 +3,62 @@
namespace WPDesk\PluginBuilder\Builder; namespace WPDesk\PluginBuilder\Builder;
use WPDesk\PluginBuilder\Plugin\AbstractPlugin; use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
use WPDesk\PluginBuilder\Storage\PluginStorage;
class AbstractBuilder { abstract class AbstractBuilder {
protected static $instances = []; /**
* Create plugin class
*/
public function build_plugin() {
}
/** /**
* @param string $class * Store plugin class in some kind of storage
* @param AbstractPlugin $object
*/ */
protected function addToStorage( $class, $object ) { public function store_plugin( PluginStorage $storage ) {
if ( isset( self::$instances[ $class ] ) ) {
throw new Exception\ClassAlreadyExists( "Class {$class} already exists" );
} }
self::$instances[ $class ] = $object;
/**
* Init plugin internal structure
*/
public function init_plugin() {
} }
/** /**
* @param string $class * Return built plugin
*
* @return AbstractPlugin * @return AbstractPlugin
*/ */
protected function getFromStorage( $class ) { abstract function get_plugin();
if ( isset( self::$instances[ $class ] ) ) {
return self::$instances[ $class ]; /**
} else { * Set settings class in plugin
throw new Exception\ClassNotExists( "Class {$class} not exists in storage" ); *
* @param $settings
*/
public function set_settings( $settings ) {
} }
/**
* Set view class in plugin
*
* @param $view
*/
public function set_view( $view ) {
}
/**
* Set tracker class in plugin
*
* @param $tracker
*/
public function set_tracker( $tracker ) {
}
/**
* Set helper class in plugin
*
* @param $helper
*/
public function set_helper( $helper ) {
} }
} }
\ No newline at end of file
...@@ -3,40 +3,51 @@ ...@@ -3,40 +3,51 @@
namespace WPDesk\PluginBuilder\Builder; namespace WPDesk\PluginBuilder\Builder;
use WPDesk\PluginBuilder\Plugin\AbstractPlugin; use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
use WPDesk\PluginBuilder\Storage\PluginStorage;
class InfoBuilder extends AbstractBuilder { class InfoBuilder extends AbstractBuilder {
const FILTER_PLUGIN_CLASS = 'wp_builder_plugin_class'; const FILTER_PLUGIN_CLASS = 'wp_builder_plugin_class';
const HOOK_BEFORE_PLUGIN_INIT = 'wp_builder_before_plugin_init'; const HOOK_BEFORE_PLUGIN_INIT = 'wp_builder_before_plugin_init';
const HOOK_AFTER_PLUGIN_INIT = 'wp_builder_before_init'; const HOOK_AFTER_PLUGIN_INIT = 'wp_builder_before_init';
/** @var AbstractPlugin */
private $plugin;
/** @var \WPDesk_Buildable */
private $info;
/** @var string */
protected $storage_id;
public function __construct( \WPDesk_Buildable $info ) {
$this->info = $info;
$this->storage_id = $info->get_class_name();
}
/** /**
* Builds instance of plugin * Builds instance of plugin
*
* @param \WPDesk_Plugin_Info $info
* @return AbstractPlugin
*
* @return AbstractPlugin
*/ */
public function build_from_info( \WPDesk_Buildable $info ) { public function build_plugin() {
$class_name = apply_filters( self::FILTER_PLUGIN_CLASS, $info->get_class_name() ); $class_name = apply_filters( self::FILTER_PLUGIN_CLASS, $this->info->get_class_name() );
/** @var AbstractPlugin $plugin */ /** @var AbstractPlugin $plugin */
$plugin = new $class_name( $info ); $this->plugin = new $class_name( $this->info );
$this->addToStorage( $info->get_class_name(), $plugin ); }
do_action( self::HOOK_BEFORE_PLUGIN_INIT, $plugin ); public function store_plugin( PluginStorage $storage ) {
$plugin->init(); $storage->add_to_storage( $this->storage_id, $this->plugin );
do_action( self::HOOK_AFTER_PLUGIN_INIT, $plugin ); }
return $plugin; public function init_plugin() {
do_action( self::HOOK_BEFORE_PLUGIN_INIT, $this->plugin );
$this->plugin->init();
do_action( self::HOOK_AFTER_PLUGIN_INIT, $this->plugin );
} }
/** /**
* @param string $class
*
* @return AbstractPlugin * @return AbstractPlugin
*/ */
public function get_plugin_instance( $class ) { public function get_plugin() {
return $this->getFromStorage( $class ); return $this->plugin;
} }
} }
\ No newline at end of file
...@@ -40,27 +40,6 @@ abstract class AbstractPlugin implements \WPDesk_Translable { ...@@ -40,27 +40,6 @@ abstract class AbstractPlugin implements \WPDesk_Translable {
$this->hooks(); $this->hooks();
} }
/**
* @return $this
*/
public function get_plugin() {
return $this;
}
/**
* @return string
*/
public function get_text_domain() {
return $this->plugin_info->get_text_domain();
}
/**
* @return void
*/
public function load_plugin_text_domain() {
load_plugin_textdomain( $this->get_text_domain(), false, $this->get_namespace() . '/lang/' );
}
public function init_base_variables() { public function init_base_variables() {
$this->plugin_url = plugin_dir_url( $this->plugin_info->get_plugin_dir() ); $this->plugin_url = plugin_dir_url( $this->plugin_info->get_plugin_dir() );
} }
...@@ -69,35 +48,44 @@ abstract class AbstractPlugin implements \WPDesk_Translable { ...@@ -69,35 +48,44 @@ abstract class AbstractPlugin implements \WPDesk_Translable {
* @return void * @return void
*/ */
protected function hooks() { protected function hooks() {
add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] );
add_action( 'wp_enqueue_scripts', array( $this, 'wp_enqueue_scripts' ) ); add_action( 'wp_enqueue_scripts', [ $this, 'wp_enqueue_scripts' ] );
add_action( 'plugins_loaded', array( $this, 'load_plugin_text_domain' ) ); add_action( 'plugins_loaded', [ $this, 'load_plugin_text_domain' ] );
add_filter( 'plugin_action_links_' . plugin_basename( $this->get_plugin_file_path() ), array( add_filter( 'plugin_action_links_' . plugin_basename( $this->get_plugin_file_path() ), [
$this, $this,
'links_filter' 'links_filter'
) ); ] );
} }
/** /**
*
* @return string * @return string
*/ */
public function get_plugin_url() { public function get_plugin_file_path() {
return esc_url( trailingslashit( $this->plugin_url ) ); return $this->plugin_info->get_plugin_dir();
} }
public function get_plugin_assets_url() { /**
return esc_url( trailingslashit( $this->get_plugin_url() . 'assets' ) ); * @return $this
*/
public function get_plugin() {
return $this;
}
/**
* @return void
*/
public function load_plugin_text_domain() {
load_plugin_textdomain( $this->get_text_domain(), false, $this->get_namespace() . '/lang/' );
} }
/** /**
* @return string * @return string
*/ */
public function get_plugin_file_path() { public function get_text_domain() {
return $this->plugin_info->get_plugin_dir(); return $this->plugin_info->get_text_domain();
} }
/** /**
...@@ -107,6 +95,18 @@ abstract class AbstractPlugin implements \WPDesk_Translable { ...@@ -107,6 +95,18 @@ abstract class AbstractPlugin implements \WPDesk_Translable {
return $this->plugin_namespace; return $this->plugin_namespace;
} }
public function get_plugin_assets_url() {
return esc_url( trailingslashit( $this->get_plugin_url() . 'assets' ) );
}
/**
*
* @return string
*/
public function get_plugin_url() {
return esc_url( trailingslashit( $this->plugin_url ) );
}
public function admin_enqueue_scripts() { public function admin_enqueue_scripts() {
} }
...@@ -125,22 +125,22 @@ abstract class AbstractPlugin implements \WPDesk_Translable { ...@@ -125,22 +125,22 @@ abstract class AbstractPlugin implements \WPDesk_Translable {
public function links_filter( $links ) { public function links_filter( $links ) {
$support_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/support/' : 'https://www.wpdesk.net/support'; $support_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/support/' : 'https://www.wpdesk.net/support';
$plugin_links = array( $plugin_links = [
'<a href="' . $support_link . '">' . __( 'Support', $this->get_text_domain() ) . '</a>', '<a href="' . $support_link . '">' . __( 'Support', $this->get_text_domain() ) . '</a>',
); ];
$links = array_merge( $plugin_links, $links ); $links = array_merge( $plugin_links, $links );
if ( $this->docs_url ) { if ( $this->docs_url ) {
$plugin_links = array( $plugin_links = [
'<a href="' . $this->docs_url . '">' . __( 'Docs', $this->get_text_domain() ) . '</a>', '<a href="' . $this->docs_url . '">' . __( 'Docs', $this->get_text_domain() ) . '</a>',
); ];
$links = array_merge( $plugin_links, $links ); $links = array_merge( $plugin_links, $links );
} }
if ( $this->settings_url ) { if ( $this->settings_url ) {
$plugin_links = array( $plugin_links = [
'<a href="' . $this->settings_url . '">' . __( 'Settings', $this->get_text_domain() ) . '</a>', '<a href="' . $this->settings_url . '">' . __( 'Settings', $this->get_text_domain() ) . '</a>',
); ];
$links = array_merge( $plugin_links, $links ); $links = array_merge( $plugin_links, $links );
} }
......
<?php <?php
namespace WPDesk\PluginBuilder\Builder\Exception; namespace WPDesk\PluginBuilder\Storage\Exception;
class ClassAlreadyExists extends \RuntimeException class ClassAlreadyExists extends \RuntimeException
{ {
......
<?php <?php
namespace WPDesk\PluginBuilder\Builder\Exception; namespace WPDesk\PluginBuilder\Storage\Exception;
class ClassNotExists extends \RuntimeException class ClassNotExists extends \RuntimeException
{ {
......
<?php
namespace WPDesk\PluginBuilder\Storage;
use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
interface PluginStorage {
/**
* @param string $class
* @param AbstractPlugin $object
*/
public function add_to_storage( $class, $object );
/**
* @param string $class
*
* @return AbstractPlugin
*/
public function get_from_storage( $class );
}
<?php
namespace WPDesk\PluginBuilder\Storage;
use WPDesk\PluginBuilder\Plugin\AbstractPlugin;
class StaticStorage implements PluginStorage {
protected static $instances = [];
/**
* @param string $class
* @param AbstractPlugin $object
*/
public function add_to_storage( $class, $object ) {
if ( isset( self::$instances[ $class ] ) ) {
throw new Exception\ClassAlreadyExists( "Class {$class} already exists" );
}
self::$instances[ $class ] = $object;
}
/**
* @param string $class
*
* @return AbstractPlugin
*/
public function get_from_storage( $class ) {
if ( isset( self::$instances[ $class ] ) ) {
return self::$instances[ $class ];
} else {
throw new Exception\ClassNotExists( "Class {$class} not exists in storage" );
}
}
}
<?php
namespace WPDesk\PluginBuilder\Storage;
class StorageFactory {
/**
* @return PluginStorage
*/
public function create_storage() {
return new StaticStorage();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment