通过表单按钮在 laravel 中触发 php 脚本的最佳方法是啥?

Posted

技术标签:

【中文标题】通过表单按钮在 laravel 中触发 php 脚本的最佳方法是啥?【英文标题】:What is the best way to trigger a php script in laravel through a form button?通过表单按钮在 laravel 中触发 php 脚本的最佳方法是什么? 【发布时间】:2019-11-27 12:39:54 【问题描述】:

我正在使用 php 脚本来抓取网站(Duzun 的 hQuery)。我有一个表单,它有一个输入,有人可以粘贴他们想要抓取的 URL,还有一个提交按钮来触发 scraping。如何设置下面的代码,以便当用户单击提交时,hQuery 脚本会选择他们输入的 URL 并运行脚本。

到目前为止,我已经尝试在 Laravel 中使用 action() 助手来触发 ScraperController 中的方法,但这似乎不起作用。我收到一条错误消息,提示 postScrape 方法尚未定义。

<form action=" action('ScraperController@postScrape') " method="POST">

route::post('/', 'ScraperController@postScrape'); 

我希望用户可以点击按钮,他们的 URL 被传递给脚本,然后它可以抓取他们链接到的网站。

【问题讨论】:

请向我们展示您尝试过的控制器代码 我原本打算将 hquery 代码放在那里,但根据下面的回复,这似乎是错误的做法。 【参考方案1】:

由于抓取可能是一项资源繁重且运行时间长的任务,因此您应该将其委托给排队的作业。您可以在此处阅读有关队列和作业的信息:https://laravel.com/docs/master/queues

我建议将用户的抓取请求保存为模型条目。这样您就可以跟踪状态(正在运行、出错、已完成等),将其显示在任务列表中,将系统负载归因于用户,等等。类似于ScrapeTaskiduser_idurlstatus时间戳以及您需要的任何其他字段)。

设置好模型和队列后,您将创建一个作业类。这可以通过运行php artisan make:job ScrapeWebsite 来完成,也可以手动创建。

app/Jobs/ScrapeWebsite.php

<?php

namespace App\Jobs;

use App\ScrapeTask;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class ScrapeWebsite implements ShouldQueue

    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /** @var ScrapeTask */
    protected $scrapeTask;

    /**
     * Create a new job instance.
     *
     * @param ScrapeTask $scrapeTask
     */
    public function __construct(ScrapeTask $scrapeTask)
    
        $this->scrapeTask = $scrapeTask;

        // also inject any necessary third party libraries, etc.
    

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    
        // scrape the website at $this->scrapeTask->url
    

你的控制器方法看起来像这样:

app/Http/Controllers/ScraperController.php

<?php

namespace App\Http\Controllers;

use Auth;
use App\ScrapeTask;
use App\Jobs\ScrapeWebsite;
use Illuminate\Http\Request;

class ScraperController extends Controller

    public function postScrape(Request $request)
    
        // perform input validation, etc.

        // create a new scrape task
        $scrapeTask = ScrapeTask::create([
            'user_id' => Auth::id(),
            'url'     => $request->input('url'),
        ]);

        // dispatch the ScrapeWebsite job to the queue
        dispatch(new ScrapeWebsite($scrapeTask));

        // redirect to a scrape status monitoring page (or do whatever...)
        return redirect()->route('scrape.monitor', $scrapeTask->id);
    

我强烈建议您设置失败的工作跟踪 (https://laravel.com/docs/master/queues#dealing-with-failed-jobs),以确保您知道什么时候出现问题。

【讨论】:

这非常有用!太感谢了。有很多可以在这里工作的。非常感谢您抽出宝贵时间做出如此详细的回复。 对我也很有帮助,感谢您提供完整的示例课程。我想知道 github 上是否有一个使用这种方法的简单队列运行器项目。我发现的那些太复杂了。顺便提一句。这应该是 imo 接受的答案。

以上是关于通过表单按钮在 laravel 中触发 php 脚本的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置可以通过 JavaScript onclick 事件触发的 PHP Curl POST 请求?

Laravel 5,单击表单提交按钮时不显示任何内容

ng-submit 在 Laravel PHP 框架中不起作用

单击按钮时附加新文本字段并通过单击 Laravel 4 中的按钮删除

如何通过关闭当前的aspx来触发另一个aspx中的按钮?

表单提交后 POST 方法返回 404 - Laravel