Определение и инициализация свойства класса в контроллере PHP Laravel

Определение и инициализация свойства класса в контроллере PHP Laravel

16.02.2020 03:37:15 Просмотров 18 Источник

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

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 я читал это.:

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

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

У вопроса есть решение - Посмотреть?

Ответы - Определение и инициализация свойства класса в контроллере PHP Laravel / Defining and initialize a class property in PHP Laravel controller

AH.Pooladvand

16.02.2020 03:48:30

Вы должны назначить свои свойства в конструкторе, как это

protected $user;

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

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

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

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

https://stackoverflow.com/questions/60248519/defining-and-initialize-a-class-property-in-php-laravel-controller/60248586#comment106573975_60248586
Thank for yous answear. Это не для моего случая. Я пробую его, и он возвращает null. Может быть, из-за того, что я не создаю новый экземпляр. При этом я использую метод и вызываю его в тех местах, где требуется.
Является ответом!
MaartenDev

16.02.2020 10:30:56

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

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

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());
Закрыть X