Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Laravel: Get access to class-variable from public static function (basic oop issues)

Tags:

oop

php

laravel

EDIT

In the meantime this question is been visited a few times. Just to share what I´ve learned with the help of stackoverflow and other resources I´d not recommend using the technique I was asking for. A cleaner way is to attach a variable containing the database-text within the controller:

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

Now you can access text in your view like so

{{ $text ?? 'Default' }}

But if you´re currently also hustling with basic oop and/or mvc architecture read on. Maybe it helps :-)


ORIGINAL QUESTION

I´m trying to output some text loaded from db. This is my setup:

View:

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

Controller:

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

}

I was trying various ways to declare a class variable and access it in my function but I always end up with:

Using $this when not in object context

tbh I think I lack some basic oop knowledge :-D

like image 511
Kristo Avatar asked Jun 05 '14 14:06

Kristo


2 Answers

Static methods do not have access to $this. $this refers to an instantiated class (an object created with a new statement, e.g. $obj = new ContentController()), and static methods are not executed within an object.

What you need to do is change all the $this to self, e.g. self::$text to access a static variable defined in your class. Then you need to change public $text = ''; to public static $text = '';

This is why static methods/variables are bad practices most of the time...

Not an expert at Laravel, but I'm sure you don't need to use static methods to pass variables into templates... If that is the case, I'm staying the hell away from Laravel...

like image 108
Populus Avatar answered Nov 07 '22 12:11

Populus


You may try something like this (In the case of 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;
    }
}

Read the other answer to understand the difference; also read about Late Static Bindings but instead...

You may try something like this in Laravel to avoid static:

class ContentController extends BaseController {

    public $text = null;

    public function getContent($description)
    {
        $content = Content::where('description', $description)->first();
        return $this->text = $content->text;
    }
}

Use it like this:

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

Also this:

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

Or this (Even without Laravel):

{{ (new ContentController)->getContent('starttext') }}
like image 31
The Alpha Avatar answered Nov 07 '22 11:11

The Alpha