在 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());
我尝试为某些控制器定义 属性,但出现错误:
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());