草庐IT

php - 在 laravel 中实现命令处理程序的问题

coder 2024-04-18 原文

我正在为我工​​作的办公室的 HR 系统实现一个小组件。我目前正在努力让用户申请休假。我正在尽最大努力使用命令处理程序(希望也是事件),因为我的 Controller 总是非常臃肿。

我想在我的应用程序中执行以下操作:

例如,首先,用户点击表单上的提交以“创建新请求”以获取假期。这应该转到 RequestController 上的 store() 方法并触发一个自处理命令,即 CreateRequestCommand。然后,此命令会将用户发出的请求存储在数据库中,然后继续执行我尚未完成的功能。

在实现上述内容时我面临两个问题:

首先,我的表单有一个文件上传。如您所知,如果我在我的 Controller 中使用 dd() 文件,我将看到可用于上传它的文件属性。但是,如果我在 CreateRequestCommand 的 handle() 函数中 dd() 它,它显示为 null。所以,我对应该在哪里执行上传逻辑感到困惑?

其次,我的表单有 9 个字段,除了 user_id 外,它们几乎与我存储在数据库中的内容匹配。所以通常我会做的,我知道这被认为是回溯练习,因此我尝试使用命令的原因是从表单中获取所有输入,然后将其全部放入模型的 create() 函数中进行存储它在数据库中。现在我已经将该逻辑提取到命令中,并通过在 laracasts 和 PurchasePodcastCommand 的文档(或其他任何内容)中查看 Taylor Otwell 的示例,我明白我需要将所有相关数据放在命令的构造函数中,这意味着我在构造函数中有 9 个变量。现在原谅我的无知,但是在构造函数中有 9 个变量看起来是错误的,所以我现在问自己 - 我这样做对吗?下面是我在上面提到的类中的一些相关代码。

应用\Http\Controllers\RequestController.php

public function store(Requests\CreateRequestRequest $request)
{
    $this->dispatchFrom(CreateRequestCommand::class, $request);
}

应用\命令\CreateRequestCommand.php

class CreateRequestCommand extends Command implements SelfHandling {

    /**
     * Values from request
     * @var mixed
     */
    protected $requestType, $attachment, $manager, $noOfDays, $dateFrom, $dateTo, $location, $contactNumber, $cover;

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct($requestType, $attachment, $manager, $noOfDays, $dateFrom, $dateTo, $location, $contactNumber, $cover)
    {
        $this->requestType   = $requestType;
        $this->attachment    = $attachment;
        $this->manager       = $manager;
        $this->noOfDays      = $noOfDays;
        $this->dateFrom      = $dateFrom;
        $this->dateTo        = $dateTo;
        $this->location      = $location;
        $this->contactNumber = $contactNumber;
        $this->cover         = $cover;
    }

    /**
     * Execute the command.
     *
     * @return void
     */
    public function handle()
    {
        // store to db here
        dd([
            'requestType'   => $this->requestType,
            'attachment'    => $this->attachment,
            'manager'       => $this->manager,
            'noOfDays'      => $this->noOfDays,
            'dateFrom'      => $this->dateFrom,
            'dateTo'        => $this->dateTo,
            'location'      => $this->location,
            'contactNumber' => $this->contactNumber,
            'cover'         => $this->cover,
        ]);
    }

}

非常感谢任何可以提供任何建议的人。如果您需要查看更多代码或任何内容,我很乐意与您分享。

最佳答案

在 Command 构造函数中有九个变量并没有错。命令对象是处理程序的 DTO(数据传输对象),因此这不仅是完全可以接受的,而且也是推荐的方式。命令对象负责确保处理程序收到所需的 $command->vars,所以是的,它们应该在构造函数中。

更新: 抱歉忘记了关于文件上传的其他问题:

要在 FormRequestObject 中处理上传的文件,请使用 $request->file('inputname') 而不是 $request->input('name')

更新: 在回复关于有一个单独的命令处理程序对象的评论时,

在 Laravel 5 中,你可以有一个 CommandObject 来处理自己的命令,也可以有一个单独的处理程序。

要创建一个自处理命令对象: php artisan make:命令 NameOfCommand

这将在 app/Commands 中创建一个命令,它将有一个 constructor() 和一个 handle() 方法。所有命令参数都应在构造函数中启动。

要使用单独的处理程序轻松创建命令,您可以简单地使用:

php artisan make:command NameOfCommand --handler

这将在 app/commands 中仅使用一个构造函数创建一个命令对象,它还将在 app/Handlers/Commands 中创建一个命令处理程序

您应该在 Command 对象的构造函数中初始化您的命令属性。

命令处理程序将有一个 handle() 方法,其中 CommandObject 作为参数传递。这样您就可以使用处理程序的构造函数来注入(inject)其他依赖项,例如处理命令可能需要的存储库。

在命令处理程序 handle() 方法中,您可以通过简单地键入诸如 $command->attachment 等内容来获取命令属性...

这应该可以回答您所有的问题:)

更新:

如下更改您的 Controller 方法:

// assign the request properties to variables - note the file is handled differently. 
$requestType = $request->get('requestType'); 
$attachment = $request->file('attachment'); 
$manager = $request->get('manager'); 
$noOfDays = $request->get('noOfDays'); 
$dateFrom = $request->get('dateFrom'); 
$dateTo = $request->get('dateTo'); 
$location = $request->get('location'); 
$contactNumber = $request->get('contactNumber'); 
$cover = $request->get('cover'); 

// dispatch the command 
return $this->dispatch(new CreateRequestCommand($requestType, $attachment, $manager, $noOfDays, $dateFrom, $dateTo, $location, $contactNumber, $cover));

关于php - 在 laravel 中实现命令处理程序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29490496/

有关php - 在 laravel 中实现命令处理程序的问题的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 在 Ruby 中实现 `call_user_func_array` - 2

    我怎样才能完成http://php.net/manual/en/function.call-user-func-array.php在ruby中?所以我可以这样做:classAppdeffoo(a,b)putsa+benddefbarargs=[1,2]App.send(:foo,args)#doesn'tworkApp.send(:foo,args[0],args[1])#doeswork,butdoesnotscaleendend 最佳答案 尝试分解数组App.send(:foo,*args)

  3. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  5. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  6. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  7. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  8. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  9. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  10. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

随机推荐