具有特质的Laravel控制台命令

时间:2019-06-07 15:04:23

标签: php laravel console artisan

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

设置如下:

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

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

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

  

NULL

,然后是我其余的代码错误。

我已经运行了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。因此,在控制台命令(UpdateRightMove)的construct方法内部,我添加了变量,并且它可以正常工作。

 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 = [];
    }

1 个答案:

答案 0 :(得分:3)

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

在您的UpdateRightmove班上:

use RightMoveTrait {
    RightMoveTrait::__construct as private _rightMoveTraitConstruct;
}

public function __construct()
{
    parent::__construct();
    $this->_rightMoveTraitConstruct();

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