The communication between different modules it's done via their Facades because they are the main entry point of a
module.
Factory vs DependencyProvider
The main difference between Factories and Dependency Providers:
- Factories are responsible for in-module dependencies,
- while Dependency Providers are responsible for module-to-module dependencies.
Setting a provided dependency
<?php
use Gacela\Framework\AbstractDependencyProvider;
final class SalesDependencyProvider extends AbstractDependencyProvider
{
public const FACADE_COMMENT = 'FACADE_COMMENT';
public function provideModuleDependencies(Container $container): void
{
$this->addCommentFacade($container);
}
private function addCommentFacade(Container $container): void
{
$container->set(
self::FACADE_COMMENT,
function (Container $container) {
return $container->getLocator()->get(CommentFacade::class);
}
);
}
}
Factory using a provided dependency
<?php
use Gacela\Framework\AbstractFactory;
final class SalesFactory extends AbstractFactory
{
public function createOrderCommentSaver(): FooService
{
return new OrderCommentSaver(
$this->getCommentFacade()
);
}
private function getOtherFacade(): OtherFacade
{
return $this->getProvidedDependency(
DependencyProvider::FACADE_COMMENT
);
}
}
The Facade uses the Factory
In the end, the Factory will be used by the module's Facade:
<?php
namespace App\Sales;
use Gacela\Framework\AbstractFacade;
final class SalesFacade extends AbstractFacade
{
public function saveComment(Comment $comment): int
{
return $this->getFactory()
->createOrderCommentSaver()
->save($comment);
}
}