在 PHP Laravel 控制器中定义和初始化 class 属性

Defining and initialize a class property in PHP Laravel controller

我尝试为某些控制器定义 属性,但出现错误:

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

Constant expression contains invalid operations

这是我的控制器代码:

命名空间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 我读到这个:

Class成员变量可以被初始化,但是这个初始化必须是一个常量值--也就是说,它必须能够在编译时求值并且不能依赖于运行-时间信息,以便评估。

我假设这条规则没有在我的代码中执行。我对吗?

你应该像这样在构造函数中分配你的属性

protected $user;

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

或通过setters...

编辑

但是在你的情况下,这不是一个好主意,请参阅 https://laravel.com/docs/5.3/upgrade#5.3-session-in-constructors

在控制器方法中检索用户很好,因为它只针对请求执行一次。没有必要将其存储为实例 属性 因为每个请求都会创建一个新的控制器实例。

您可以使用以下代码:

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());