【问题标题】:Laravel: Get access to class-variable from public static function (basic oop issues)Laravel:从公共静态函数访问类变量(基本 oop 问题)
【发布时间】:2014-06-05 14:06:25
【问题描述】:

编辑

与此同时,这个问题被访问了几次。只是为了分享我在 stackoverflow 和其他资源的帮助下学到的东西,我不建议使用我要求的技术。一种更简洁的方法是在控制器中附加一个包含数据库文本的变量:

$txt = Model::find(1);
return view('name', array('text' => $txt->content);

现在您可以像这样访问视图中的文本

{{ $text ?? 'Default' }}

但是,如果您目前还在忙于使用基本的 oop 和/或 mvc 架构,请继续阅读。也许它有帮助:-)


原始问题

我正在尝试输出一些从 db 加载的文本。 这是我的设置:

查看:

{{ ContentController::getContent('starttext') }}

控制器:

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;
    }

}

我尝试了各种方法来声明一个类变量并在我的函数中访问它,但我总是得到:

不在对象上下文中使用 $this

tbh 我认为我缺乏一些基本的 oop 知识 :-D

【问题讨论】:

  • 视图没有对控制器类的显式访问($this 在该上下文中不存在)。这是一个基本的 MVC 原则,将逻辑(控制器)与表示(视图)分离。文档非常清楚地显示了这个示例:View::make('greeting', array(...stuff here...)) 其中“stuff”是您需要从控制器传递给视图的任何内容。让我这样说吧:阅读文档 (laravel.com/docs/responses)。
  • 另外,您应该首先从有关 PHP OOP 的文档 (php.net/manual/en/language.oop5.php) 开始。你写的代码毫无意义。
  • 坚持 MVC 原则时,您绝对是对的。但是为什么不使用 Laravel 强大的路由系统来渲染一些没有用户输入的简单视图呢?
  • 如果是Route::get '/' return View::make('homepage'),那么可以,不要过度设计。这不仅仅是关于用户输入。您在控制器中拥有 Eloquent DB 访问权限,该控制器具有以 Blade 视图响应的方法。请不要在routes.php 中进行 Eloquent 查询。请做单独的逻辑、表示和数据存储。

标签: php oop laravel


【解决方案1】:

静态方法无权访问$this$this 指的是实例化类(使用new 语句创建的对象,例如$obj = new ContentController()),静态方法不在对象内执行。

您需要做的是将所有$this 更改为self,例如self::$text 访问您的类中定义的 static 变量。那你需要把public $text = '';改成public static $text = '';

这就是为什么静态方法/变量在大多数情况下都是不好的做法...

不是 Laravel 专家,但我敢肯定你不需要使用静态方法将变量传递到模板中......如果是这样的话,我会远离 Laravel......

【讨论】:

    【解决方案2】:

    你可以尝试这样的事情(在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;
        }
    }
    

    阅读其他答案以了解区别;还阅读了有关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;
        }
    }
    

    像这样使用它:

    {{ App::make('ContentController')->getContent('starttext') }}
    

    还有这个:

    {{ with(new ContentController)->getContent('starttext') }}
    

    或者这个(即使没有Laravel):

    {{ (new ContentController)->getContent('starttext') }}
    

    【讨论】:

      【解决方案3】:

      在 Laravel 5.7 中,or 运算符已被删除,因此 {{ $text or 'Default' }} 不再起作用。 新运营商是??。从 Laravel 5.7 开始,它应该是 {{ $text ?? 'Default' }}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-01
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2013-11-12
        相关资源
        最近更新 更多