【问题标题】:Why my interface is not instantiable when handle a command?为什么处理命令时我的界面不可实例化?
【发布时间】:2022-01-13 18:07:22
【问题描述】:

Laravel CQRS

我在 Laravel 中应用 CQRS 只是为了学习如何使用它。

我创建了一个简单的用户注册和一个控制器,该控制器创建一个命令来调度句柄并使用正确的用例。

当尝试在控制器中使用接口时,看起来我需要绑定接口和实现,因为它不知道要使用哪一个,但在这种情况下我真的不明白如何绑定界面。

CreateUserController.php

<?php
    
    declare(strict_types=1);
    
    namespace App\Http\Controllers\User;
    use App\Http\Controllers\Controller;
    use App\Http\Requests\Users\CreateUserRequest;
    use Illuminate\Http\RedirectResponse;
    
    class CreateUserController extends Controller
    {
        public function __construct(private \Src\User\Infrastructure\CreateUserController $userController)
        {
        }
    
        public function __invoke(CreateUserRequest $request): RedirectResponse
        {
            $this->userController->__invoke($request);
    
            return redirect()->route('verify');
        }
    }

Src\User\Infrastructure\CreateUserController

<?php

declare(strict_types=1);

namespace Src\User\Infrastructure;

use App\Http\Requests\Users\CreateUserRequest;
use Src\Shared\Domain\Bus\Command\CommandBus;
use Src\User\Application\Create\CreateUserCommand;    

final class CreateUserController
{    
    public function __construct(private CommandBus $commandBus)
    {
    }

    public function __invoke(CreateUserRequest $request)
    {
        $name = $request->name;
        $email = $request->email;
        $password = $request->password;

        $command = new CreateUserCommand($name, $email, $password);
        $this->commandBus->dispatch($command);
    }
}

CommandBus

<?php

declare(strict_types=1);

namespace Src\Shared\Domain\Bus\Command;

interface CommandBus
{
    public function dispatch(Command $command): void;
}

命令

<?php

declare(strict_types=1);

namespace Src\Shared\Domain\Bus\Command;

interface Command
{
}

CreateUserCommandHandler

<?php

declare(strict_types=1);

namespace Src\User\Application\Create;

use Src\User\Domain\ValueObjects\UserEmail;
use Src\User\Domain\ValueObjects\UserName;
use Src\User\Domain\ValueObjects\UserPassword;

final class CreateUserCommandHandler
{
    public function __construct(
        private UserCreator $creator
    )
    {
    }

    public function __invoke(CreateUserCommand $command)
    {
        $name = new UserName($command->name());
        $email = new UserEmail($command->email());
        $password = new UserPassword($command->password());

        $this->creator->__invoke($name, $email, $password);
    }
}

错误

我试过了:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Src\Shared\Domain\Bus\Command\Command;
use Src\User\Application\Create\CreateUserCommand;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(
            Command::class,
            CreateUserCommand::class
        );
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

【问题讨论】:

    标签: php laravel cqrs


    【解决方案1】:

    这里是你可以如何绑定接口。

    app/Providers 文件夹中创建一个类。你可以给这个类起任何名字。例如。 InterfaceServiceProvider。用Illuminate\Support\ServiceProvider扩展它

    namespace App\Providers;
    use Illuminate\Support\ServiceProvider;
    
    class InterfaceServiceProvider extends ServiceProvider
    {
        /**
         * Register services.
         *
         * @return void
         */
        public function register()
        {
            $this->app->bind(YourInterFace::class, YourController::class);
        }
    
        /**
         * Bootstrap services.
         *
         * @return void
         */
        public function boot()
        {
            //
        }
    }
    

    将此InterfaceServiceProvider 添加到config/app.phpproviders 数组中 例如。

    'providers' => [
    App\Providers\InterfaceServiceProvider::class,
    ]
    

    【讨论】:

    • 它不能解决我的问题,我收到 500 错误,尝试将接口绑定到类时出现问题,我不知道是否必须绑定 CommandBus 或命令和哪个控制器。
    • 你到底遇到了什么错误?
    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2022-01-16
    • 2015-07-02
    • 2020-03-11
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多