Tài nguyên trừu tượng trong Laravel Nova


Một trong những chiến lược kiến ​​trúc mã hóa chính mà tôi sử dụng khi xây dựng một dự án Laravel Nova phức tạp là khả năng có một lớp tài nguyên trừu tượng.

Nhân tiện, trước khi bắt đầu, nếu bạn muốn tìm hiểu sâu về Nova, tôi khuyên bạn nên đăng ký nhận các bản cập nhật trong khóa học Mastering Nova sắp tới của tôi sẽ được phát hành vào giữa mùa hè này!


Một lớp tài nguyên trừu tượng sẽ kế thừa cơ sở Resource lớp học. Điều này cho phép bạn ghi đè các phương thức cụ thể để thêm chức năng trên các lớp tài nguyên thực của bạn.

Cuối cùng, bất kỳ phương thức nào bạn cải thiện trong lớp cơ sở tùy chỉnh sẽ có sẵn trên tài nguyên mô hình của bạn. Tôi sẽ chỉ cho bạn cách tạo tài nguyên trừu tượng và sau đó chúng ta sẽ cải tiến cụ thể.

Chúng tôi bắt đầu bằng cách tạo một tệp Tóm tắtResource.php bên trong app/Novanhư thế này:

app/
  Nova/
     AbstractResource.php

Lúc đầu, AbstractResource trông như thế này:

namespace App\Nova;

abstract class AbstractResource extends Resource
{
}

Tiếp theo, trong các lớp Tài nguyên của bạn chỉ kế thừa từ Tài nguyên trừu tượng này thay vì Tài nguyên Nova:

namespace App\Nova;

use App\Nova\AbstractResource;

class Review extends AbstractResource
{
    
}

Vì vậy, hãy xem một số ví dụ về những cải tiến mà bạn có thể thêm vào tài nguyên trừu tượng mới của mình.

# Mặc định phân loại

Trên Tài nguyên trừu tượng của bạn hãy viết mã này:

public static function indexQuery(NovaRequest $request, $query)
{
    $uriKey = static::uriKey();
    
    if (($request->orderByDirection ?? null) !== null) {
        return $query;
    }
    
    if (! empty(static::$indexDefaultOrder)) {
        $query->getQuery()->orders = ();

        return $query->orderBy(
            key(static::$indexDefaultOrder), 
            reset(static::$indexDefaultOrder)
        );
    }
}

Sau đó, trên tài nguyên mô hình của bạn:

public static $indexDefaultOrder = ('email' => 'asc');

Điều này sẽ sắp xếp truy vấn chỉ mục của bạn theo “email, asc” trong trường hợp không có thứ tự sắp xếp được chọn trước.

# Tìm kiếm mối quan hệ

Nếu bạn có trường mối quan hệ, bạn có thể thấy rằng bạn không thể sử dụng nó để tìm kiếm trên trường tìm kiếm Tài nguyên của mình. Trong trường hợp đó, bạn có thể sử dụng
titasgailius/search-relations bưu kiện.

Để cài đặt nó, chỉ cần nhập nó qua Composer:

composer require titasgailius/search-relations

Sau đó, trong Tài nguyên trừu tượng của bạn, bạn có thể thêm nó như sau:

use Titasgailius\SearchRelations\SearchesRelations;

abstract class AbstractResource extends Resource
{
    use SearchesRelations;
}

Do đó, trên tài nguyên mô hình của bạn, bạn chỉ cần thêm:

public static $searchRelations = (
    'user' => ('username', 'email'),
);

trong đó khóa là tên mối quan hệ của bạn và sau đó là một mảng các giá trị cột có thể tìm kiếm được. Vì vậy bây giờ bạn có thể tìm kiếm trên các cột mối quan hệ của mình!

# Chia sẻ Thẻ, Ống kính, Hành động và Bộ lọc

Giả sử bạn muốn có một thẻ chung hiển thị thông tin về lần cuối cùng tài nguyên hiện tại của bạn được cập nhật là khi nào và một số thông tin bổ sung khác liên quan đến tài nguyên của bạn; hoặc một hành động thực sự sẽ thay đổi trạng thái trên các mô hình có chung status_type cột.

Tất cả chức năng này có thể được chia sẻ giữa các tài nguyên mô hình.

Ví dụ: giả sử bạn muốn thêm Thẻ mới vào tất cả các tài nguyên mô hình chia sẻ tài nguyên trừu tượng của mình, bạn có thể thực hiện như sau:

public function cards(Request $request){
    return (
        new ResourceInformation(
            $this->getCurrentResourceInstance($this->getModelInstance())
        ),
    );
}

protected function getModelInstance()
{
    $resourceKey = explode("https://stitcher.io/", request()->path())(1);

    $resourceClass = Nova::resourceForKey($resourceKey);

    return new $resourceClass::$model;
}

và trong Tài nguyên mô hình của bạn:

public function cards(Request $request)
{
    return array_merge(
        (), 
        parent::cards($request),
    );
}

# Vô hiệu hóa hành vi ‘vào thùng rác’

Các BelongsTo trường đã có tùy chọn xóa hộp kiểm ‘Đã vào thùng rác’ (về cơ bản không hiển thị các mục đã được đưa vào thùng rác), nhưng nếu muốn xóa nó khỏi bất kỳ thao tác mối quan hệ nào khác (ví dụ: BelongsToMany)?

Bạn chỉ cần áp dụng đoạn mã sau vào tài nguyên trừu tượng của mình:

use Illuminate\Support\Facades\Gate;


public static function softDeletes()
{
    
    if (static::authorizable()) {
        if (! method_exists(
            Gate::getPolicyFor(static::newModel()),
            'trashedAny'
        )) {
            return true;
        }       

        return Gate::check('trashedAny', static::class));
    };

    return parent::softDeletes();
}

trong ví dụ này, tất cả những gì bạn phải làm là xác định chính sách cho mô hình của mình và sau đó tạo một phương thức mới có tên trashedAny(User $user)ví dụ như:

public function trashedAny(User $user)
{
    return false;
}

Đây là những ví dụ có thể khơi dậy suy nghĩ của bạn về cách tận dụng Tài nguyên trừu tượng trong các dự án Nova của bạn.

Và nếu tôi thuyết phục được bạn 🙂 Tôi khuyên bạn nên đăng ký nhận thông tin cập nhật về khóa học Mastering Nova sắp tới của tôi sẽ được phát hành vào giữa mùa hè này!

Tốt nhất, Bruno



Leave a Comment

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Scroll to Top