通过表单按钮在 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
我建议将用户的抓取请求保存为模型条目。这样您就可以跟踪状态(正在运行、出错、已完成等),将其显示在任务列表中,将系统负载归因于用户,等等。类似于ScrapeTask
(id
、user_id
、url
、status
、时间戳以及您需要的任何其他字段)。
设置好模型和队列后,您将创建一个作业类。这可以通过运行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 请求?
ng-submit 在 Laravel PHP 框架中不起作用