代码之家  ›  专栏  ›  技术社区  ›  Mr. B.

Laravel/雄辩:如何钩住删除过程?

  •  1
  • Mr. B.  · 技术社区  · 6 年前

    从中删除记录时 my_items_table 我想把记录插入 my_items_table_archive .

    我可以在每个控制器上这样做,但是 更喜欢用雄辩的模式 .

    有这样的东西吗?

    Pseudocode:

    class MyItem extends Model {
        protected function beforeDelete($record) {
            MyItemArchive::create($record); // add record the archive
            return true; // continue deletion of $record 
        }
    }
    

    有什么想法吗?谢谢!

    3 回复  |  直到 6 年前
        1
  •  4
  •   ExohJosh    6 年前

    是的,有一些类似于您的伪代码。

    你可以利用 Eloquent Events

    下面是一个很好的例子:

    protected $dispatchesEvents = [
        'deleted' => UserDeleted::class,
        'deleting' => UserDeleting::class
    ];
    

    所讨论的课程只需遵守/遵循: Listeners

    您还可以使用雄辩的观察者/观察者模式来获得类似的结果。

    让我知道你是怎么上的!

        2
  •  2
  •   FULL STACK DEV    6 年前

    首先,使用

    php artisan make:observer MyItemObserver
    

    然后

    <?php
    
    
    namespace App\Observers;
    
    
    class MyItemObserver
    {
    
        public function deleting(MyItem $myItem)
        {
         /// insert new record here
        }
    }
    

    现在你在你 appServiceProvider

    class AppServiceProvider extends ServiceProvider
    {
        /**
         * Bootstrap any application services.
         *
         * @return void
         */
        public function boot()
        {
            MyItem::observe(MyItemObserver::class);
        }
    
        /**
         * Register the service provider.
         *
         * @return void
         */
        public function register()
        {
            //
        }
    }
    

    现在,您的obverserver将被连接到模型事件。

    希望这有帮助。

        3
  •  1
  •   IlGala    6 年前

    如中所述 official documentation 使用事件有两个选择。第一个是创建这样的观察者:

    class MyModelObserver
    {
    
        /**
        * Listen to the Model deleting event.
        *
        * @param  User  $user
        * @return void
        */
        public function deleting(User $user)
        {
          // HERE YOUR CODE TO TRANSFER THE MODEL
        }
    
      }
    

    比你必须在你的 AppServiceProvider

    public function boot {
      MyModel::observe(MyModelObserver::class)
    }
    

    否则,可以通过生成特定类在模型中添加这些事件:

    protected $dispatchesEvents = [
        'deleting' => MyModelDeletingEvent::class,
    ];
    

    无论如何,如果您使用的是低于5.4的Laravel版本,那么应该检查文档中的具体实现,因为 $dispatchesEvents 不能作为变量使用。