翻译进度
12
分块数量
2
参与人数

定义 Actions

这是一篇社区协同翻译的文章,你可以点击右边区块信息里的『改进』按钮向译者提交改进建议。

Nova 操作允许你在一个或者多个 Eloquent 模型上执行自定义任务。例如你可以定义一个操作,这个操作向请求账户数据的用户发送邮件。或者,你可以编写一个将一组记录传输个另外一个用户的操作。
一旦将操作附加到资源定义后,你可以从资源的列表或者详细信息的页面启动他:

Action

ncgis 翻译于 2个月前

概览

Nova 的操作可以通过 nova:action 的 Artisan 命令自动生成。默认情况下,所有定义的操作文件都被放在 app/Nova/Actions 目录下面

php artisan nova:action EmailAccountProfile

为了能更好的了解怎么定义 Nova 的操作,我们看一下下面的例子,在这个例子中,我们定义了一个向用户或者用户组发送 email 消息的操作:

<?php

namespace App\Nova\Actions;

use App\AccountData;
use Illuminate\Bus\Queueable;
use Laravel\Nova\Actions\Action;
use Illuminate\Support\Collection;
use Laravel\Nova\Fields\ActionFields;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class EmailAccountProfile extends Action
{
    use InteractsWithQueue, Queueable, SerializesModels;

    /**
     *  在给定的模型上执行操作。
     *
     * @param  \Laravel\Nova\Fields\ActionFields  $fields
     * @param  \Illuminate\Support\Collection  $models
     * @return mixed
     */
    public function handle(ActionFields $fields, Collection $models)
    {
        foreach ($models as $model) {
            (new AccountData($model))->send();
        }
    }

    /**
     * 在操作中获得可用的字段。
     *
     * @return array
     */
    public function fields()
    {
        return [];
    }
}
ncgis 翻译于 2个月前

操作中最重要的方法是 handlehandle 方法接收任何的字段的值和选择的模型的资源集合。注意,即使是只有一个模型,handle 方法
一直接收模型的 Collection 数据。

handle 方法中,你可以执行完成操作所需的任何任务,你可以自由更新数据库记录,发送电子邮件,调用其他服务等。天高任鸟飞,海阔凭鱼跃。

ncgis 翻译于 2个月前

操作的字段

有时候,我们希望在执行操作之前收集用户的其他信息。出于这个考虑,Nova 允许你将 Nova 的大部分支持的字段直接附加到操作中。启动操作后,Navo 会提示用户输入字段:

Action Field
给操作添加字段,请将该字段添加到操作 fields 方法返回的字段数组中:

use Laravel\Nova\Fields\Text;

/**
 *  在操作中获得可用的字段。
 *
 * @return array
 */
public function fields()
{
    return [
        Text::make('Subject'),
    ];
}
ncgis 翻译于 2个月前

最后 ,在 handle 方法重,您可以在所提供的 ActionFields 中使用动态访问器访问您的字段:

/**
 * 在给定的模型上执行操作。
 *
 * @param  \Laravel\Nova\Fields\ActionFields  $fields
 * @param  \Illuminate\Support\Collection  $models
 * @return mixed
 */
public function handle(ActionFields $fields, Collection $models)
{
    foreach ($models as $model) {
        (new AccountData($model))->send($fields->subject);
    }
}
ncgis 翻译于 2个月前

操作的相应

通常,当操作执行完成后,会在 Nova 的页面上显示一个“成功”的消息,然而,你可以使用 Action 类中多中多样的的方法来自由的定义响应。
为了展示“成功”消息,你可以在 handle 方法中使用 Action::message 返回这个结果:

/**
 *  在给定的模型上执行操作。
 *
 * @param  \Laravel\Nova\Fields\ActionFields  $fields
 * @param  \Illuminate\Support\Collection  $models
 * @return mixed
 */
public function handle(ActionFields $fields, Collection $models)
{
    // ...

    return Action::message('It worked!');
}

为了返回红色的 ,“危险”的信息,你可以用 Action::danger 方法:

return Action::danger('Something went wrong!');
ncgis 翻译于 2个月前

重定向响应

要在执行操作后将用户重定向到全新位置,您可以使用以下 Action::redirect 方法:

return Action::redirect('https://example.com');

下载响应

要在执行操作后启动文件下载,您可以使用该 Action::download 方法。该 download 方法接受要下载的文件的URL作为其第一个参数,并将所需的文件名作为其第二个参数:

return Action::download('https://example.com/invoice.pdf', 'Invoice.pdf');
ncgis 翻译于 2个月前

队列操作

有时,你需要一段时间才能完成操作。出于这个原因,Nova 可以轻松的将你的操作加入队列。为了告诉 Nova 操作是队列操作,而不是同步执行的,需要 操作继承 ShouldQueue 接口:

<?php

namespace App\Nova\Actions;

use App\AccountData;
use Illuminate\Bus\Queueable;
use Laravel\Nova\Actions\Action;
use Illuminate\Support\Collection;
use Laravel\Nova\Fields\ActionFields;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class EmailAccountProfile extends Action implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    // ...
}

使用排队操作时,不要忘记为应用程序配置和启动队列工作程序。否则,您的操作将不会被处理。

队列操作文件

目前,Nova 不支持将 File 字段附加到排队的操作。如果需要将 File 字段附加到操作,则必须同步运行该操作。

ncgis 翻译于 2个月前

自定义队列链接和队列

你可以通过定义操作的 $connection$queue 属性来定义队列的链接和队列的名称:

/**
 *  job 应该发送到的链接 。
 *
 * @var string|null
 */
public $connection = 'redis';

/**
 * job发送时的名称
 *
 * @var string|null
 */
public $queue = 'emails';
ncgis 翻译于 2个月前

操作日志

查看已针对资源运行的操作的日志通常很有用。此外,在排队操作时,了解它们何时实际完成通常很重要。值得高兴的是,Nova 通过将Laravel\Nova\Actions\Actionable trait 附加到资源的相应Eloquent模型,Nova可以轻松地将动作日志添加到模型资源中。
例如,我们可以附加 Laravel\Nova\Actions\Actionable trait 给 User 模型:

<?php

namespace App;

use Laravel\Nova\Actions\Actionable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Actionable, Notifiable;

    // ...
}

一旦这个trait被附加给这个模型,Nova将自动的开始资源的详细页面底部展示操作的日志

Action Log

ncgis 翻译于 2个月前

队列操作的状态

为了能够查看通过模型集合传递给操作任何和模型的状态,当队列操作在执行是,你可以更新操作的状态。例如,您可以使用操作的markAsFinished 方法来指示操作已完成处理的模型:

/**
 * 在给定的模型上执行操作。
 *
 * @param  \Laravel\Nova\Fields\ActionFields  $fields
 * @param  \Illuminate\Support\Collection  $models
 * @return mixed
 */
public function handle(ActionFields $fields, Collection $models)
{
    foreach ($models as $model) {
        (new AccountData($model))->send($fields->subject);

        $this->markAsFinished($model);
    }
}
ncgis 翻译于 2个月前

或者,如果您想要指出某个给定模型的动作“失败”,您可以使用 markAsFailed 方法:

/**
 * Perform the action on the given models.
 *
 * @param  \Laravel\Nova\Fields\ActionFields  $fields
 * @param  \Illuminate\Support\Collection  $models
 * @return mixed
 */
public function handle(ActionFields $fields, Collection $models)
{
    foreach ($models as $model) {
        try {
            (new AccountData($model))->send($fields->subject);
        } catch (Exception $e) {
            $this->markAsFailed($model, $e);
        }
    }
}
ncgis 翻译于 2个月前

本文章首发在 Laravel China 社区
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

参与译者:2
讨论数量: 0
发起讨论


暂无话题~