编辑
与此同时,这个问题被访问了几次。只是为了分享我在 stackoverflow 和其他资源的帮助下学到的东西,我不建议使用我要求的技术。更简洁的方法是在控制器中附加一个包含数据库文本的变量:
$txt = Model::find(1);
return view('name', array('text' => $txt->content);
Run Code Online (Sandbox Code Playgroud)
现在您可以像这样访问视图中的文本
{{ $text ?? 'Default' }}
Run Code Online (Sandbox Code Playgroud)
但是,如果您目前也在忙于基本的 oop 和/或 mvc 架构,请继续阅读。也许它有帮助:-)
原问题
我正在尝试输出一些从数据库加载的文本。这是我的设置:
看法:
{{ ContentController::getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)
控制器:
class ContentController extends BaseController {
public $text = '';
public static function getContent($description)
{
$content = Content::where('description', $description)->get();
$this->text = $content[0]->text;
return $this->text;
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了各种方法来声明一个类变量并在我的函数中访问它,但我总是得到:
tbh 我想我缺乏一些基本的 oop 知识:-D
静态方法无权访问$this
. $this
指的是实例化的类(用语句创建的对象new
,例如$obj = new ContentController()
),并且静态方法不在对象内执行。
您需要做的是将所有更改$this
为self
,例如self::$text
访问类中定义的静态变量。然后你需要更改public $text = '';
为public static $text = '';
这就是为什么静态方法/变量大多数时候都是不好的做法......
不是 Laravel 专家,但我确信你不需要使用静态方法将变量传递到模板中...如果是这样的话,我就远离 Laravel...
你可以尝试这样的事情(在 的情况下static
):
class ContentController extends BaseController {
public static $text = null;
public static function getContent($description)
{
$content = Content::where('description', $description)->first();
return static::$text = $content->text;
}
}
Run Code Online (Sandbox Code Playgroud)
阅读其他答案以了解差异;还阅读了Late Static Bindings但相反......
您可以尝试这样的方法Laravel
来避免static
:
class ContentController extends BaseController {
public $text = null;
public function getContent($description)
{
$content = Content::where('description', $description)->first();
return $this->text = $content->text;
}
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
{{ App::make('ContentController')->getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)
还有这个:
{{ with(new ContentController)->getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)
或者这个(即使没有Laravel
):
{{ (new ContentController)->getContent('starttext') }}
Run Code Online (Sandbox Code Playgroud)