Php 在Laravel清晰的上下文中使用契约

Php 在Laravel清晰的上下文中使用契约,php,laravel,Php,Laravel,使用此选项,您会有一个问题: 关于存储抽象和使用类似契约的东西与多个实现呢 例如,购物车功能。 当用户登录时,购物车数据应存储在数据库中。 当用户注销时,存储在会话中的数据 因此,有一个选择: 创建一组名为Elount的作业,例如: App\Domains\Cart\Jobs\Eloquent\AddToCartJob App\Domains\Cart\Jobs\elount\FlushCartJob 类似地,创建其他作业集,会话: App\Domains\Cart\Jobs\Session\

使用此选项,您会有一个问题: 关于存储抽象和使用类似契约的东西与多个实现呢

例如,购物车功能。 当用户登录时,购物车数据应存储在数据库中。 当用户注销时,存储在会话中的数据

因此,有一个选择:

创建一组名为Elount的作业,例如:

App\Domains\Cart\Jobs\Eloquent\AddToCartJob

App\Domains\Cart\Jobs\elount\FlushCartJob

类似地,创建其他作业集,会话:

App\Domains\Cart\Jobs\Session\AddToCartJob

App\Domains\Cart\Jobs\Session\FlushCartJob

但如何在每个作业集之间切换取决于条件:用户登录或否? 看起来应该是某种类型的存储库,在每个方法中应该使用第一个或第二个集合中的一些作业

某种程度上:

//...
use App\Domains\Cart\Jobs\Eloquent\AddToCartJob;

class EloquentCart implements CartContract
{
    //...

    public function addToCart(array $data)
    {
        //...

        return $this->run(new AddToCartJob($data));
    }
}
以及:

在AddToCartFeature中:

最后,将上下文绑定与用户登录的条件一起使用


这是正常的解决方案还是合同执行应该在清晰的上下文中以另一种方式开发?在特性和作业之间再创建一层是正常的做法,还是存在另一种在实现之间切换的方式?

当涉及到抽象和设计模式时,建议它们存在于代码中,而不是Lucid的组件特性、操作和作业中;将体系结构保持在代码的外围,而不是前台

您的多存储库方法是一个很好的起点。假设你有:

App\Data\Repositories\CookieRepository 应用程序\数据\存储库\数据库存储库 现在我们可以有两个单独的作业,每个作业访问相应的存储库: 饼干

App\Domains\Cart\Jobs\AddToCookieCartJob App\Domains\Cart\Jobs\FlushCookieCartJob 雄辩的

App\Domains\Cart\Jobs\AddToDatabaseCartJob App\Domains\Cart\Jobs\FlushDatabaseCatJob 这确保了作业保持原子性,并根据它们所做的事情显式命名。这有助于在浏览功能或操作时了解我们正在做什么,而不必检查名称空间并与类似的作业名称混淆,或处理名称空间别名。有关作业的详细信息,请参阅中的

现在我们已经建立了基础,我们需要根据登录的服务器调用这些作业?条件鉴于功能不应该处理复杂的工作单元,这将是一个伟大的操作场所

App\Operations\AddToCartOperation 如果登录→ AddToDatabaseCartJob 其他的→ AddToCookieCartJob App\Operations\FlushCartOperation也是如此 现在,我们的功能不必知道这些细节,只需运行以下操作:

类AddToCartFeature扩展了功能 { //... 公共函数HandlerRequest$请求,CartContract$服务 { //... $status=$this->runAddToCartOperation::class,[…]; //... 返回$this->runSomeOtherJob::class,压缩'status'; } } 至于代码的其余部分,您可以使用适合您的情况的任何设计模式

以上名称仅为示例,请根据您的约定重命名


我希望我正确地理解了你的问题,并且这个答案有帮助

但是功能列表是否足够长呢?我是否应该检查用户是否已登录每个操作?如果将来会出现更多将数据存储到数据库的子条件,例如,只有高级计划用户才能存储购物车并继续从另一台机器上购物,基本计划用户只能在会话中存储数据。在每次操作中处理所有条件并不方便。将条件保留在一个位置不是更好吗,比如使用条件进行上下文绑定?我认为在每个操作的执行过程中,检查用户是否多次登录没有问题。因为每个操作都有自己的逻辑,如果它的逻辑依赖于这个条件,那么拥有它并没有什么害处。事实上,这是需要的。对于有几个条件的案例,我建议您看看策略设计模式,这对您的案例可能有帮助?如果您所说的操作是相似的,那么它们可能应该是具有共同条件的操作中的作业?如果不在功能中使用此类操作,又如何?如果我有GetCartDataOperation,例如在视图生成器或中间件中使用此操作是否是一种好的做法?理想情况下,操作应该在需要时在features或Artisan命令中运行。在渲染的情况下,最好准备视图/编写器所需的所有数据,并将其传递给执行渲染的作业。然而,Lucid是灵活的,允许在几乎任何上下文中运行操作。如果您认为从视图或视图编写器运行它对您最有效,那么就使用它,但请确保将其作为一个模式指南,以遵循 在您的代码中的任何地方都使用ow,并实现一致性。在视图中的操作和视图编写器之间,我只选择编写器。
//...
use App\Domains\Cart\Jobs\Session\AddToCartJob;

class SessionCart implements CartContract
{
    //...

    public function addToCart(array $data)
    {
        //...

        return $this->run(new AddToCartJob($data));
    }
}
//...

class AddToCartFeature extends Feature
{
    //...

    public function handle(Request $request, CartContract $service)
    {
        //...

        return $service->addToCart($request->all());
    }
}