带有 Trait 的 Laravel 控制台命令

Posted

技术标签:

【中文标题】带有 Trait 的 Laravel 控制台命令【英文标题】:Laravel Console Command with a Trait 【发布时间】:2019-10-23 02:41:05 【问题描述】:

我已经为我正在处理的 Trait 设置了一些配置变量,其中一个是 data_format 变量,它可以是 json 或 xml。

它是这样设置的:

$this->data_format = config('rightmove.FORMAT');

在控制器中,我可以运行 dd($this->data_format) 并返回:“json

我已经将此作为控制台命令,但是当我尝试使用 dd 为 $this->data_format 运行控制台命令时,它会返回

以及随后我的其余代码错误。

我已经运行了php artisan config:cache 命令来清除缓存,但控制台似乎没有拾取该配置变量?

我的App\Console\Commands\UpdateRightMove 如下所示:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Traits\RightMoveTrait;
use App\Property;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
use QCod\AppSettings\Setting\AppSettings;


class UpdateRightmove extends Command

    use RightMoveTrait;

    private $is_set;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'rightmove:update';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Updates Rightmove - Creates / Updates and Deletes properties from the Rightmove API';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    
        parent::__construct();

        $this->is_set = setting('rightmove');
    

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    

        if($this->is_set == 1)
        
            // Rightmove is Enabled via settings (Run Command)...
            $now = Carbon::now();

            // Check App Cache for Last Time RightMove Artisan Command was Ran...
            //$last_ran = cache('rightmove_update');
            $last_ran = '2019-06-07 14:52:40';

            if($last_ran == NULL)
            
                // Send ALL Properties to Rightmove, First Time Ran....
                $properties = Property::whereNotNull('ref')
                    ->where('beds', '>', 0 )
                    ->where('price', '>', 0)
                    ->where('name', '!=', '')
                    ->where('city', '!=', '')
                    ->whereRaw('LENGTH(postcode) >= 5')
                    ->get();
            
            else
            
                $from_date = Carbon::now();

                // Get a Difference between last ran and now...
                $time_diff = $from_date->diffInHours($last_ran);

                // This will run and get properties that have changed since the last task ran
                $to_date = Carbon::now()->subHours($time_diff);

                // Get Filtered Properties & One's added / updated in last 12 hours...
                $properties = Property::whereNotNull('ref')
                    ->where('beds', '>', 0 )
                    ->where('price', '>', 0)
                    ->where('name', '!=', '')
                    ->where('city', '!=', '')
                    ->whereRaw('LENGTH(postcode) >= 5')
                    ->whereBetween('created_at', [$to_date, $from_date])
                    ->orWhereBetween('updated_at', [$to_date, $from_date])
                    ->get();
            

            // Get Settings....
            if(setting('overseas') == 0)
            
                // UK Based....
                $this->update_feed_uk($properties);
            
            else
            
                // Overseas....
            

            Cache::rememberForever('rightmove_update', function()
            
                return now()->toDateTimeString();
            );
        
    

我的RightMoveTrait如下:

<?php

namespace App\Traits;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
use App\Property;
use App\PropertyType;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Storage;

trait RightMoveTrait

    private $network_id;
    private $branch_id;
    private $data_format;
    private $environment;
    private $allow_delete;
    private $current_time;

    public function __construct()
    
        $this->network_id = config('rightmove.NETWORK_ID');
        $this->branch_id = config('rightmove.BRANCH_ID');
        $this->data_format = config('rightmove.FORMAT');
        $this->allow_delete = config('rightmove.ALLOW_DELETE');
        $this->environment = config('rightmove.ENVIRONMENT');

        $now = Carbon::now();
        $this->current_time = $now;

        $this->refs = [];
    

    function update_feed_uk($properties)
    
        dd($this->data_format);
    

编辑 控制台运行似乎跳过了特征中的 __construct。因此,在 Console 命令 (UpdateRightMove) 的构造方法中,我添加了变量,它可以正常工作。

 public function __construct()
    
        parent::__construct();

        $this->is_set = setting('rightmove');

        $this->network_id = config('rightmove.NETWORK_ID');
        $this->branch_id = config('rightmove.BRANCH_ID');
        $this->data_format = config('rightmove.FORMAT');
        $this->allow_delete = config('rightmove.ALLOW_DELETE');
        $this->environment = config('rightmove.ENVIRONMENT');

        $now = Carbon::now();
        $this->current_time = $now;

        $this->refs = [];
    

【问题讨论】:

在您的 app/Console/Kernel.php 通过将 \Artisan::command('test', function () $this-&gt;info(config('rightmove.FORMAT'));); 添加到方法 commands() 中,当您执行 php artisan test 时,它是否会在您的控制台中返回 json ? 另外,我们可以看看你的RightMoveTrait 吗? 这不能被试图帮助你的人复制,请包括 trait 和 config,这样会更容易。 是的,会的。我不在办公桌前,打算回来 嗨,我已经添加了。 【参考方案1】:

不会调用您的 trait 的 __construct() 函数,因为该类使用自己的 __construct() 函数。

在您的UpdateRightmove 班级中:

use RightMoveTrait 
    RightMoveTrait::__construct as private _rightMoveTraitConstruct;


public function __construct()

    parent::__construct();
    $this->_rightMoveTraitConstruct();

    $this->is_set = setting('rightmove');

【讨论】:

以上是关于带有 Trait 的 Laravel 控制台命令的主要内容,如果未能解决你的问题,请参考以下文章

在 laravel 5.6 中找不到 Trait 'App\HasRoles' 错误

Laravel/Eloquent 建议覆盖 trait 属性?

如何在 Laravel 中创建一个 Trait

php Laravel Uuid Trait

php Laravel:HasDatatable Trait用法

php Laravel:HasDatatable Trait