ホームページ > バックエンド開発 > PHPチュートリアル > 10月の拡張 - ソフトディレットプラグインを構築します

10月の拡張 - ソフトディレットプラグインを構築します

Joseph Gordon-Levitt
リリース: 2025-02-10 10:21:14
オリジナル
1053 人が閲覧しました

Extending OctoberCMS - Building a Soft-Delete Plugin

OctureCMS:プラグインの拡張性とプラグインの実用的なソフトウェアの削除の詳細な調査

開発者は一般に、使いやすくスケーラブルなCMSを好みます。 OctureCmsは、最初にシンプルさの概念を順守し、開発者とユーザーに心地よい体験をもたらします。この記事では、10月の拡張機能のいくつかを示し、単純なプラグインを使用した別のプラグインの機能を拡張します。

Extending OctoberCMS - Building a Soft-Delete Plugin

キーポイント

  • OctureCMSは、プラグインを介して拡張機能を許可しながら、シンプルで使いやすいCMSを提供します。このスケーラビリティは、他の開発者プラグインの機能の変更を含む、開発者がCMSの内部メカニズムに侵入できる程度に反映されます。
  • RainLabブログプラグインを使用すると、記事を作成して、さまざまなカテゴリに割り当てることができます。このチュートリアルでは、このプラグインを拡張し、ソフト削除機能を追加し、記事が永続的に削除されないようにする方法を示していますが、代わりに「削除」と記録されたタイムスタンプとしてマークします。
  • ソフト削除機能を作成するには、新しいプラグインを作成し、データベースにフィールドを追加する必要があります。このフィールドは、記事の削除のタイムスタンプを保存します。プラグインは、記事リストを拡張してこの新しいフィールドを列として含めるように拡張し、削除された記事を表示または非表示にするフィルターを追加します。 deleted_at
  • ソフト削除関数を作成する最後のステップは、記事の削除操作をインターセプトし、
  • 列を更新することです。これは、雄弁さによってトリガーされたdeleted_atイベントに接続し、レコードの削除を妨げることによって行われます。代わりに、deletingフィールドは現在のタイムスタンプに更新され、レコードは保存されます。 deleted_at
はじめに

各CMSには、プラットフォームの機能を拡張するプラグインシステムがあり、CMSの内部メカニズムに侵入できる範囲でそのスケーラビリティを測定します。ただし、CMS自体だけでなく、プラグインについても話しています!

プラグインを構築する場合、他の開発者があなたの機能の一部を変更できることを確認する必要があります。たとえば、リスト内の記事を選択して記事を公開できるブログプラグインがあります。新しい記事が公開されたことを示すためにイベントをトリガーするのが最善です。別の開発者はこのイベントにマウントし、電子メールで購読者に通知できます!

class Posts extends Controller
{
    public function index_onPublish()
    {
        if (($checkedIds = post('checked')) && is_array($checkedIds) && count($checkedIds)) {

            foreach ($checkedIds as $postId) {
                if ((!$post = Post::find($postId)) || !$post->canEdit($this->user))
                    continue;

                $post->publish();
                Event::fire('rainlab.blog.posts.published', [$post]);
            }

            Flash::success('Successfully published those posts.');
        }

        return $this->listRefresh();
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
他の開発者は、このイベントを聴いて、公開された記事を処理することができます。

Event::listen('rainlab.blog.posts.published', function($post) {
    User::subscribedTo($post)->each(function($user) use($post) {
        Mail::send('emails.notifications.post-published', ['user' => $user, 'post' => $post], function($message) use($user, $post) {
            $message->from('us@example.com', 'New post by ' . $user->name);

            $message->to($user->email);
        });
    });
});
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
主にイベントを使用して、リクエストサイクルのさまざまな部分にフックします。よりよく理解するために、具体的な例から始めましょう。

rainLabブログプラグイン

しばらくの間OctureCMSを使用している場合は、RainLabブログプラグインについて知っておく必要があります。バックエンドに記事を追加してカテゴリに添付することができ、コンポーネントを使用してフロントエンドに表示できます。

記事リストページで、記事を削除できます。しかし、それらをそっと削除したい場合はどうなりますか?これを行うことができるかどうかを見て、10月のスケーラビリティについて詳しく知りましょう。

新しいプラグインを作成

足場アシスタントコマンドを使用してデモ用の新しいプラグインを作成し、Plugin.phpファイルのプラグインの詳細を更新します。

class Posts extends Controller
{
    public function index_onPublish()
    {
        if (($checkedIds = post('checked')) && is_array($checkedIds) && count($checkedIds)) {

            foreach ($checkedIds as $postId) {
                if ((!$post = Post::find($postId)) || !$post->canEdit($this->user))
                    continue;

                $post->publish();
                Event::fire('rainlab.blog.posts.published', [$post]);
            }

            Flash::success('Successfully published those posts.');
        }

        return $this->listRefresh();
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

拡張データベースモード

ソフト削除について話すとき、最初に思い浮かぶのは、データベースに存在する必要があるdeleted_atフィールド列です。

フォルダーの下にblogplus/updatesという名前の新しいファイルを作成し、create_posts_deleted_at_field.phpファイルを更新します。 version.yaml

Event::listen('rainlab.blog.posts.published', function($post) {
    User::subscribedTo($post)->each(function($user) use($post) {
        Mail::send('emails.notifications.post-published', ['user' => $user, 'post' => $post], function($message) use($user, $post) {
            $message->from('us@example.com', 'New post by ' . $user->name);

            $message->to($user->email);
        });
    });
});
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
php artisan create:plugin rafie.blogplus
ログイン後にコピー
クラスの移行

テーブルを変更し、rainlab_blog_posts列を追加します。変更を有効にするために、deleted_atコマンドを実行することを忘れないでください。 php artisan plugin:refresh rafie.blogplus

拡張記事リスト

次に、ディスプレイのためにリストに列としてフィールドを追加する必要があります。 OctureCMSは、現在表示されているウィジェットをマウントして変更するイベントを提供します(バックエンドリストはウィジェットと見なされます)。

# updates/version.yaml

1.0.1:
    - First version of blogplus.
    - create_posts_deleted_at_field.php
ログイン後にコピー
注:上記のコードは

メソッドに配置する必要があります。 Plugin@boot

各ページでコードが実行されないようにするIFステートメントがあり、その後、リストウィジェットに新しい列を追加し、

メソッドを使用して既存の列を削除することもできます。使用可能な列オプションのリストについては、ドキュメントを確認してください。 removeColumn

Extending OctoberCMS - Building a Soft-Delete Plugin

拡張フィルター

記事リストの上部にある列を使用すると、ユーザーは日付、カテゴリなどを使用してリストをフィルタリングできます。私たちの場合、削除された記事を表示/非表示にするためのフィルターが必要です。

# updates/create_posts_deleted_at_field.php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreatePostsDeletedAtField extends Migration
{
    public function up()
    {
        Schema::table('rainlab_blog_posts', function (Blueprint $table) {
            $table->timestamp('deleted_at')->nullable()->default(null);
        });
    }

    public function down()
    {
        Schema::table('rainlab_blog_posts', function (Blueprint $table) {
            $table->dropColumn('deleted_at');
        });
    }
}
ログイン後にコピー
ドキュメントのリストフィルターの詳細を読むことができます。上記のコードは非常に簡単で、いくつかのオプションしか含まれていません。ただし、

属性は、scopeモデルインスタンスで定義されているクエリスコープメソッドの名前である必要があります。 Models\Post

拡張可能なクラス

OctunRainextensionExtendENDABLETRAIT特性は、新しい方法、属性、動作などを追加して既存のクラスを動的に拡張するための

MAGICメソッドを提供します。この例では、スコープフィルターを処理するために記事モデルに新しいメソッドを追加する必要があります。

// plugin.php  在Plugin类的boot方法中

Event::listen('backend.list.extendColumns', function ($widget) {
    if (!($widget->getController() instanceof \Rainlab\Blog\Controllers\Posts)) {
        return;
    }

    $widget->addColumns([
        'deleted_at' => [
            'label' => 'Deleted',
            'type' => 'date',
        ],
    ]);
});
ログイン後にコピー

addDynamicPropertyなどについても同じことができます。記事リストを更新して、変更が機能するかどうかを確認しましょう。 asExtension

Extending OctoberCMS - Building a Soft-Delete Plugin Extending OctoberCMS - Building a Soft-Delete Plugin もちろん、最後の部分を完了する必要があるため、削除された記事はまだありません。記事の削除操作を傍受し、

列のみを更新する必要があるためです。

ヒント:scopeプロパティを使用する代わりに、条件を使用して、単純な条件を指定できます。次のコードは、モデルスコープを使用するのと同じように機能します。

class Posts extends Controller
{
    public function index_onPublish()
    {
        if (($checkedIds = post('checked')) && is_array($checkedIds) && count($checkedIds)) {

            foreach ($checkedIds as $postId) {
                if ((!$post = Post::find($postId)) || !$post->canEdit($this->user))
                    continue;

                $post->publish();
                Event::fire('rainlab.blog.posts.published', [$post]);
            }

            Flash::success('Successfully published those posts.');
        }

        return $this->listRefresh();
    }
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

雄弁イベント

雄弁さは、各操作に関する一連のイベント(作成、更新、削除など)をトリガーします。この場合、削除イベントにフックし、レコードの削除を防ぐ必要があります。

レコードを削除すると、実際の削除操作が実行される前に

イベントがトリガーされ、その後deletingイベントがトリガーされます。 deletedイベントでfalseを返すと、操作は中止されます。 deleting

Event::listen('rainlab.blog.posts.published', function($post) {
    User::subscribedTo($post)->each(function($user) use($post) {
        Mail::send('emails.notifications.post-published', ['user' => $user, 'post' => $post], function($message) use($user, $post) {
            $message->from('us@example.com', 'New post by ' . $user->name);

            $message->to($user->email);
        });
    });
});
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
これで、最終結果をテストする準備ができました!いくつかのレコードを削除し続け、記事リストページに移動して、リスト内の削除されたアイテムを切り替えることができるかどうかを確認します。

結論

この記事では、10月のプラットフォームのさまざまな部分を拡張する方法の簡単な概要を説明します。詳細については、ドキュメントの拡張機能プラグインセクションをご覧ください。ご質問やコメントがある場合は、以下にメッセージを残してください!

10月の拡張とソフト削除プラグインの構築に関するFAQ

10月のソフトウェア削除プラグインの目的は何ですか?

10月のソフト削除プラグインは、永続的なデータ損失を防ぐように設計されています。レコードを削除すると、データベースから完全に削除されるわけではありません。代わりに、a

タイムスタンプがレコード用に設定されています。これは、アプリケーションの観点から、レコードは「削除」されていると見なされますが、必要に応じて取得できることを意味します。これは、データが誤って削除される可能性があるシナリオで特に役立ちます。これは、簡単に回復できるためです。

deleted_atソフト削除とハード削除の違いはどうですか?

ハード削除はデータベースから永久にレコードを削除し、バックアップがない限り復元できません。一方、ソフト削除は削除されたレコードを単にマークし、実際にはデータベースから削除しません。これにより、必要に応じてレコードを回復できます。

10月にソフト削除関数を実装する方法は?

10月にソフト削除機能を実装するには、プラグインを作成する必要があります。これには、新しいプラグインの作成、データベーステーブルへの

列の追加、モデルを更新して

特性を使用することが含まれます。その後、モデルのdeleted_atメソッドを使用して、レコードを柔らかく削除し、SoftDeletesメソッドを使用して回復できます。 delete restore 10月のソフト削除関数をテストする方法は?

ユニットテストを作成して、ソフト削除関数をテストできます。これには、新しいテストケースの作成、データベースに新しいレコードの作成、柔らかく削除され、データベースにまだ存在するが、削除されているとマークされていると主張することが含まれます。

既存のレコードでソフト削除関数を使用できますか?

はい、既存のレコードでソフト削除関数を使用できます。既存のデータベーステーブルに

列を追加するだけです。既存のすべてのレコードのこの列には、

値が削除されていないことを示します。 deleted_at

10月にソフト削除されたレコードを回復するにはどうすればよいですか?

ソフト削除されたレコードを回復するには、モデルでrestoreメソッドを使用できます。これにより、レコードからdeleted_atタイムスタンプが削除され、効果的に「整理」します。

10月のソフト削除レコードを永続的に削除できますか?

はい、モデルのforceDeleteメソッドを使用してソフト削除されたレコードを永続的に削除できます。これにより、ハード削除のようにデータベースからレコードが削除されます。

10月のソフト削除レコードを含むすべてのレコードを表示する方法は?

ソフト削除レコードを含むすべてのレコードを表示するには、モデルでwithTrashedメソッドを使用できます。これにより、ソフト削除されているかどうかにかかわらず、すべてのレコードが返されます。

10月の列の列の名前をカスタマイズできますか? deleted_at

はい、モデルの

メソッドを上書きすることにより、getDeletedAtColumn列の名前をカスタマイズできます。 deleted_atがお客様のニーズに適していない場合、これにより、異なる列名を使用できます。 deleted_at

10月の特定のレコードのソフト削除関数を無効にできますか?

はい、モデルの

メソッドを使用して、一部のレコードに対してソフト削除を無効にすることができます。これにより、Soft Delete機能から特定のレコードを除外できます。 withoutGlobalScope

以上が10月の拡張 - ソフトディレットプラグインを構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート