Определение и инициализация свойства класса в контроллере PHP Laravel - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь определить определенное свойство для некоторого контроллера и получаю ошибку:

Symfony \ Component \ Debug \ Exception \ FatalErrorException (E_UNKNOWN)

Выражение константы содержит недопустимые операции

Это мой код контроллера:

Пространство имен App \ Http \ Controllers ...;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Customer;
use App\City;
use Illuminate\Database\Eloquent\Builder;
use Carbon\Carbon;

use Illuminate\Support\Facades\Auth;

class CatalogController extends Controller
{
    protected $user = Auth::user();

    function user() {
       $user = optional(Auth::user())->load(['city']);
       return $user;
    }
}

В php. net Я прочитал это:

Переменные-члены класса могут быть инициализированы, но эта инициализация должна быть постоянным значением, то есть она должна быть в состоянии быть оцененной во время компиляции и не должна зависеть от информации времени выполнения для оценки .

Я предполагаю, что это правило не выполняется в моем коде. Я прав?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2020

Извлечение пользователя в методе контроллера хорошо, потому что оно выполняется только один раз для запроса. Нет необходимости использовать его как свойство экземпляра, поскольку для каждого запроса создается новый экземпляр контроллеров.

Вы можете использовать следующий код:

public function index()
{
    $user = Auth::user()->with('city')->get();
    $articles = $this->getArticlesForUser($user);

    return view('home', [
        'user' => $user
    ]);
}

public function getArticlesForUser(User $user){
  // Do something with $user
  return [];
}

public function delete()
{
    $user = Auth::user();
    $user->delete();

    return view('home');
}

Если цель нужно рассчитать значения один раз и использовать их в разных местах, где можно использовать синглтон:

<?php

class Settings {
    private $accessToken = '';
    private $items = [];

    private static $instance = null;

    protected function __construct(){}

    public static function getInstance(){
        if(static::$instance == null){
            static::$instance = static::buildInstance();
        }

        return static::$instance;
    }

    private static function buildInstance(){
        $instance = new Settings();
        $instance->accessToken = md5(rand(1,1000));
        $instance->items = [1,2,3];

        return $instance;
    }

    public function getToken(){
        return $this->accessToken;
    }
}

$settings = Settings::getInstance();
// Both return the same token because the instance is the same
var_dump($settings->getToken());
var_dump(Settings::getInstance()->getToken());
0 голосов
/ 16 февраля 2020

Вы должны назначить свои свойства в конструкторе следующим образом

protected $user;

public function __construct()
    {
        $this->user = Auth::user();
    }

или через setters ...

Редактировать

Однако в в твоем случае это не очень хорошая идея, см. https://laravel.com/docs/5.3/upgrade#5 .3-сеанс в конструкторах

...