Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve subscribers registration #32

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
131 changes: 115 additions & 16 deletions inc/Container/AbstractServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

namespace LaunchpadCore\Container;

use League\Container\Container;
use League\Container\ContainerAwareInterface;
use League\Container\Definition\DefinitionInterface;
use LaunchpadCore\Container\Registration\Registration;
use LaunchpadCore\Container\Registration\SubscriberRegistration;
use League\Container\ServiceProvider\AbstractServiceProvider as LeagueServiceProvider;

abstract class AbstractServiceProvider extends LeagueServiceProvider implements ServiceProviderInterface {
Expand Down Expand Up @@ -41,10 +40,7 @@ public function declares(): array {
* @return boolean
*/
public function provides( string $alias ): bool {
if ( ! $this->loaded ) {
$this->loaded = true;
$this->define();
}
$this->load();

return parent::provides( $alias );
}
Expand All @@ -55,7 +51,9 @@ public function provides( string $alias ): bool {
* @return string[]
*/
public function get_front_subscribers(): array {
return [];
$this->load();

return $this->fetch_subscribers_by_type( 'front' );
}

/**
Expand All @@ -64,7 +62,9 @@ public function get_front_subscribers(): array {
* @return string[]
*/
public function get_admin_subscribers(): array {
return [];
$this->load();

return $this->fetch_subscribers_by_type( 'admin' );
}

/**
Expand All @@ -73,7 +73,9 @@ public function get_admin_subscribers(): array {
* @return string[]
*/
public function get_common_subscribers(): array {
return [];
$this->load();

return $this->fetch_subscribers_by_type( 'common' );
}

/**
Expand All @@ -82,7 +84,9 @@ public function get_common_subscribers(): array {
* @return string[]
*/
public function get_init_subscribers(): array {
return [];
$this->load();

return $this->fetch_subscribers_by_type( 'init' );
}

/**
Expand All @@ -97,11 +101,9 @@ public function register_service( string $classname, callable $method = null, st

$registration = new Registration( $classname );

if( $method ) {
$registration->set_definition( $method );
}


if ( $method ) {
$registration->set_definition( $method );
}

if ( $concrete ) {
$registration->set_concrete( $concrete );
Expand All @@ -116,6 +118,65 @@ public function register_service( string $classname, callable $method = null, st
return $registration;
}

/**
* Register a subscriber.
*
* @param string $classname Classname from the subscriber.
* @param string $type Type of the subscriber.
* @return SubscriberRegistration
*/
protected function register_subscriber( string $classname, string $type ): SubscriberRegistration {
$registration = new SubscriberRegistration( $classname, $type );

$this->services_to_load[] = $registration;

if ( ! in_array( $classname, $this->provides, true ) ) {
$this->provides[] = $classname;
}

return $registration;
}

/**
* Register an admin subscriber.
*
* @param string $classname Classname from the subscriber.
* @return SubscriberRegistration
*/
public function register_admin_subscriber( string $classname ): SubscriberRegistration {
return $this->register_subscriber( $classname, 'admin' );
}

/**
* Register a front subscriber.
*
* @param string $classname Classname from the subscriber.
* @return SubscriberRegistration
*/
public function register_front_subscriber( string $classname ): SubscriberRegistration {
return $this->register_subscriber( $classname, 'front' );
}

/**
* Register a common subscriber.
*
* @param string $classname Classname from the subscriber.
* @return SubscriberRegistration
*/
public function register_common_subscriber( string $classname ): SubscriberRegistration {
return $this->register_subscriber( $classname, 'common' );
}

/**
* Register an init subscriber.
*
* @param string $classname Classname from the subscriber.
* @return SubscriberRegistration
*/
public function register_init_subscriber( string $classname ): SubscriberRegistration {
return $this->register_subscriber( $classname, 'init' );
}

/**
* Define classes.
*
Expand All @@ -133,4 +194,42 @@ public function register() {
$registration->register( $this->getLeagueContainer() );
}
}

/**
* Loads definitions.
*
* @return void
*/
protected function load() {
if ( $this->loaded ) {
return;
}

$this->loaded = true;
$this->define();
}

/**
* Fetch subscribers by type.
*
* @param string $type Type of subscriber.
* @return array
*/
protected function fetch_subscribers_by_type( string $type ): array {
$subscribers = [];

foreach ( $this->services_to_load as $service ) {
if ( ! $service instanceof SubscriberRegistration ) {
continue;
}

if ( $type !== $service->get_type() ) {
continue;
}

$subscribers [] = $service->get_id();
}

return $subscribers;
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
<?php

namespace LaunchpadCore\Container;
namespace LaunchpadCore\Container\Registration;

use League\Container\Container;
use League\Container\Definition\DefinitionInterface;

class Registration {

Expand Down Expand Up @@ -92,4 +91,13 @@ public function register( Container $container ) {

( $this->definition )( $class_registration );
}

/**
* Get id from the container.
*
* @return string
*/
public function get_id(): string {
return $this->id;
}
}
35 changes: 35 additions & 0 deletions inc/Container/Registration/SubscriberRegistration.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace LaunchpadCore\Container\Registration;

use LaunchpadCore\Container\Registration\Registration;

class SubscriberRegistration extends Registration {

/**
* Type of subscriber.
*
* @var string
*/
protected $type;

/**
* Instantiate the class.
*
* @param string $id Id from the class.
* @param string $type Type from the subscriber.
*/
public function __construct( string $id, string $type ) {
parent::__construct( $id );
$this->type = $type;
}

/**
* Get the type of subscriber.
*
* @return string
*/
public function get_type(): string {
return $this->type;
}
}
11 changes: 10 additions & 1 deletion tests/Integration/inc/Plugin/adminload.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace LaunchpadCore\Tests\Integration\inc\Plugin;

use LaunchpadCore\EventManagement\EventManager;
use LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_init\ServiceProvider;
use LaunchpadCore\Tests\Integration\inc\Traits\SetupPluginTrait;
use LaunchpadCore\Tests\Integration\TestCase;

Expand All @@ -23,11 +24,15 @@ public function testShouldDoAsExpected()
$event_setup = [
'admin_hook',
'common_hook',
'init_hook'
'init_hook',
'method_registration_common_hook',
'method_registration_init_hook',
'method_registration_admin_hook',
];

$event_not_setup = [
'front_hook',
'method_registration_front_hook',
];

$events =array_merge($event_setup, $event_not_setup);
Expand All @@ -41,6 +46,10 @@ public function testShouldDoAsExpected()
\LaunchpadCore\Tests\Integration\inc\Plugin\classes\admin\ServiceProvider::class,
\LaunchpadCore\Tests\Integration\inc\Plugin\classes\front\ServiceProvider::class,
\LaunchpadCore\Tests\Integration\inc\Plugin\classes\init\ServiceProvider::class,
ServiceProvider::class,
\LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_admin\ServiceProvider::class,
\LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_front\ServiceProvider::class,
\LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_common\ServiceProvider::class,
]);

foreach ($event_setup as $event) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_admin;

use LaunchpadCore\Container\AbstractServiceProvider;

class ServiceProvider extends AbstractServiceProvider
{

/**
* @inheritDoc
*/
protected function define()
{
$this->register_admin_subscriber(Subscriber::class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_admin;

class Subscriber
{
/**
* @hook method_registration_admin_hook
*/
public function method_registration_admin_callback()
{

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_common;

use LaunchpadCore\Container\AbstractServiceProvider;

class ServiceProvider extends AbstractServiceProvider
{

/**
* @inheritDoc
*/
protected function define()
{
$this->register_common_subscriber(Subscriber::class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_common;

class Subscriber
{
/**
* @hook method_registration_common_hook
*/
public function method_registration_common_callback()
{

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_front;

use LaunchpadCore\Container\AbstractServiceProvider;

class ServiceProvider extends AbstractServiceProvider
{

/**
* @inheritDoc
*/
protected function define()
{
$this->register_front_subscriber(Subscriber::class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace LaunchpadCore\Tests\Integration\inc\Plugin\classes\method_registration_front;

class Subscriber
{
/**
* @hook method_registration_front_hook
*/
public function method_registration_front_callback()
{

}
}
Loading
Loading