如何使用laravel 5.1使用谁更新记录的user_id填充modified_by?

时间:2015-07-29 19:24:52

标签: php laravel laravel-5 traits

使用Laravel 5.1时,我正在尝试创建一个会自动更新以下3列的Observer

  1. created_by:在创建的记录中填充"永远不再更新此消息"
  2. modified_by:每次修改记录时填充新值
  3. purged_by:在软删除记录时填充值。
  4. 据我所知,Eloquent会自动更新日期时间戳(created_by,updated_at,removed_at),但我需要更新进行更改的user_id。

    我被建议使用Observer和一个特性来处理这个问题。这就是我所做的

    1)创建了一个名为" ModelSignature"的观察者类。位于app\Observers\ModelSignature.php,这是它的内容

    <?php 
    
    namespace App\Observers;
    
    class ModelSignature {
    
        protected $userID;
    
        public function __construct(){
            $this->userID =  Auth::id();
        }
    
    
        public function updating($model)
        {
            $model->modified_by = $this->userID;
        }
    
    
        public function creating($model)
        {
            $model->created_by = $this->userID;
        }
    
    
        public function removing($model)
        {
            $model->purged_by = $this->userID;
        }
    
    }
    

    然后我创建了一个名为&#34; RecordSignature&#34;位于app\Traits\RecordSignature.php并包含以下代码

    <?php
    
    namespace App\Traits;
    
    use app\Observers\ModelSignature;
    
    trait RecordSignature
    {
    
        public static function bootObservantTrait()
        {
            static::observe(new ModelSignature() );
        }
    }
    

    最后,在我的&#34;帐户&#34;模型位于&#34; app \ Models \ Account.php&#34;我像这样使用它

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use App\Models\industry;
    use App\Traits\RecordSignature;
    use App\Traits\TrimScalarValues;
    
    
    class Account extends Model
    {
        use RecordSignature, TrimScalarValues;
        /**
         * The database table used by the model.
         *
         * @var string
        */
        protected $table = 'accounts';
    
        protected $primaryKey = 'account_id';
    
        const CREATED_AT = 'created_on';
    
        const UPDATED_AT = 'modified_on';
    
        const REMOVED_AT = 'purged_on';
    
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
        */
        protected $fillable = ['client_id','account_name', 'company_code', 'legal_name', 'created_by','modified_by','instrucations'];
    
        /**
         * The attributes excluded from the model's JSON form.
         *
         * @var array
        */
        //protected $hidden = ['account_id', 'remember_token'];
    
    
        protected $guarded = ['account_id'];
    
        /**
         * Get the industry record associated with the account.
        */
        public function industry()
        {
            return $this->hasOne(industry, industry::primaryKey);
        }
    
        public function pk(){
    
            return $this->primaryKey;
        }
    
    }
    

    问题是方法updating()removing()creating()没有按预期填充userId。似乎字段被忽略或方法没有被解雇!

    我在这里做错了什么?

3 个答案:

答案 0 :(得分:2)

你应该能够摆脱你的ModelSignatures类并将你的特性改为:

client.getProductsPage(0) { products, page, reachedEnd, error in
    guard error == nil else {
        // Handle errors here
        return
    }

    self.products = products   // you may have to do a cast here
}

希望这有帮助!

答案 1 :(得分:0)

我建议您使用此类升级https://github.com/fico7489/laravel-revisionable-upgrade

的venturecraft可修订包

一切都会开箱即用,你只需要使用2个特征,你可以做更多的事情来获取编辑模型的信息,你可以获得编辑特定列的信息,甚至特定的价值等...... < / p>

答案 2 :(得分:0)

第1步:制作特质

namespace App\Traits;

use App\Observer\ModelObserver;

trait ObservantTrait
{

    public static function bootObservantTrait()
    {
        static::observe(ModelObserver::class);
    }

}

第2步:建立观察者

<?php

namespace App\Observer;

use Illuminate\Auth\AuthManager;
use Illuminate\Contracts\Config\Repository;
use Request;

class ModelObserver
{

    public $userID;
    protected $auth;
    protected $login_user;
    protected $ip;
    protected $user_agent;

    public function __construct(AuthManager $auth, Repository $config)
    {
        $this->auth = $auth;
        $this->login_user = $auth->guard($this->auth->getDefaultDriver())->user();
        if (isset($this->login_user->id)) {
            $this->userID = $this->login_user->id;
            $this->ip = Request::ip();
            $this->user_agent = Request::header('user-agent');
        }
    }


    public function updating($model)
    {

        $model->updated_by = $this->userID;
        $model->ip = Request::ip();
        $model->user_agent = Request::header('user-agent');

    }

    public function creating($model)
    {

        $model->created_by = $this->userID;
        $model->ip = Request::ip();
        $model->user_agent = Request::header('user-agent');

    }

    public function deleted($model)
    {

        $model->deleted_by = $this->userID;
        $model->ip = Request::ip();
        $model->user_agent = Request::header('user-agent');
        $model->save();

    }

}

第3步:模型中的用户特征

use ObservantTrait;