percymamedy/laravel-accessory

Laravel 5 的特性集合和辅助方法

dev-master / 0.1.x-dev 2018-03-31 07:05 UTC

This package is auto-updated.

Last update: 2024-09-05 04:46:33 UTC


README

Laravel Accessory

简介

Laravel Accessory 为您的 Laravel 应用程序提供了一组辅助方法和特性,以增强其功能。

许可证

Laravel Accessory 是开源软件,采用 MIT 许可证

安装

此包仅适用于 Laravel 版本 5.*。

像安装其他由 Composer 管理的依赖项一样安装 Laravel Accessory。

$ composer require percymamedy/laravel-accessory

配置

如果您使用的是 Laravel >= 5.5,则可以跳过服务注册和别名注册,因为 Laravel 具有自动包发现功能。

用法

让我们来看看 Laravel Accessory 提供的可用特性和辅助方法。

可用特性

Laravel Accessory 提供了一些有用的特性,可以轻松应用于您的类。

Makable

Makable 特性简单地为您的类添加了一个 static make() 方法。这允许您流畅地创建类的实例,而无需每次都使用 new 关键字。这仅仅是给对象创建添加了糖。

以下是一个应用了 Makable 特性的 Mail 类

<?php

namespace App\Mail;

use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Accessory\Support\Makable;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
    use Makable, Queueable, SerializesModels;

    /**
     * The order instance.
     *
     * @var Order
     */
    protected $order;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        //
    }
}

您现在可以使用 static make() 方法直接在类上创建 Mail 类的实例,如下所示

<?php

namespace App\Http\Controllers;

use App\Order;
use App\Mail\OrderShipped;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Http\Controllers\Controller;

class OrderController extends Controller
{
    /**
     * Ship the given order.
     *
     * @param  Request  $request
     * @param  int  $orderId
     * @return Response
     */
    public function ship(Request $request, $orderId)
    {
        $order = Order::findOrFail($orderId);

        // Ship order...

        $message = OrderShipped::make($order);

        Mail::to($request->user())->send($message);
    }
}

Makable 特性的良好用途包括在 JobsMailablesEventsNotifications 中。当然,您也可以将其应用于任何您想要的类。

Dispatchable

Dispatchable 特性扩展了 Illuminate\Foundation\Bus\Dispatchable,但添加了一个 static dispatchNow() 方法,允许您将 Jobs 发送到当前进程中的适当处理器。

以下是一个应用了 Dispatchable 特性的 Job 类

<?php

namespace App\Jobs;

use App\Podcast;
use App\AudioProcessor;
use Illuminate\Bus\Queueable;
use Accessory\Bus\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class ProcessPodcast implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $podcast;

    /**
     * Create a new job instance.
     *
     * @param  Podcast  $podcast
     * @return void
     */
    public function __construct(Podcast $podcast)
    {
        $this->podcast = $podcast;
    }

    /**
     * Execute the job.
     *
     * @param  AudioProcessor  $processor
     * @return void
     */
    public function handle(AudioProcessor $processor)
    {
        // Process uploaded podcast...
    }
}

您现在可以使用 static dispatchNow() 方法立即将 Job 发送到类,如下所示

<?php

namespace App\Http\Controllers;

use App\Jobs\ProcessPodcast;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PodcastController extends Controller
{
    /**
     * Store a new podcast.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        // Create podcast...

        ProcessPodcast::dispatchNow($podcast);
    }
}

Dispatchable 特性还添加了一个 when() 方法,允许您根据传递给此方法的条件分发 Job。

您现在可以根据传递给 when() 方法的条件分发 Job。

<?php

namespace App\Http\Controllers;

use App\Jobs\ProcessPodcast;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PodcastController extends Controller
{
    /**
     * Store a new podcast.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        // Create podcast...

        ProcessPodcast::when($request->has('process_podcast'))->dispatch($podcast);
    }
}

您还可以向 when() 方法传递一个闭包。闭包应返回一个布尔值,这将决定是否分发 Job。

<?php

namespace App\Http\Controllers;

use App\Jobs\ProcessPodcast;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PodcastController extends Controller
{
    /**
     * Store a new podcast.
     *
     * @param  Request  $request
     * @return Response
     */
    public function store(Request $request)
    {
        // Create podcast...

        ProcessPodcast::when(function() use($request) {
            return $request->has('process_podcast') && $request->process_podcast === 1;
        })->dispatch($podcast);
    }
}