setMeta не устанавливает новые значения?

120
27 июня 2021, 02:40

Добрый день есть такие файлы

default.php
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <?=$this->getMeta()?>
</head>
<body>
<h1>Шаблон Default</h1>
<?=$content; ?>
</body>
</html>

Где с помощью getMeta выводится мета теги. Они и выводится но значения что я записываю в MainController не идут


namespace app\controllers;

class MainController extends AppController
{
  public function indexAction(){
   $dsa = $this->setMeta('Главная страница','Мой суперский сайт', 'keyowrds');
  }
}

controller.php

<?php

namespace ishop\base;

abstract class Controller
{
  public $route;
  public $controller;
  public $model;
  public $view;
  public $layout;
  public $prefix;
  public $data = [];
  public $meta = ['title' => '', 'description'=>'', 'keywords'=>''];
  public function __construct($route)
  {
    $this->route = $route;
    $this->controller = $route['controller'];
    $this->model = $route['controller'];
    $this->view = $route['action'];
    $this->prefix = $route['prefix'];
  }
  public function getView(){
    $viewObject = new View($this->route, $this->layout, $this->view, $this->meta);
    $viewObject->render($this->data);
  }
  public function set($data){
    $this->data = $data;
  }
  public function setMeta($title = '', $description = '', $keywords = ''){
    $this->$meta['title'] = $title;
    $this->$meta['description'] = $description;
    $this->$meta['keywords'] = $keywords;
  }

}

view.php


<?php

namespace ishop\base;

use ishop\App;
use mysql_xdevapi\Exception;
class View
{
  public $route;
  public $controller;
  public $model;
  public $view;
  public $layout;
  public $prefix;
  public $data = [];
  public $meta = [];
  public function __construct($route,  $layout = '', $view = '', $meta)
  {
    $this->route = $route;
    $this->controller = $route['controller'];
    $this->model = $route['controller'];
    $this->view = $view;
    $this->prefix = $route['prefix'];
    $this->meta = $meta;
    if($layout === false){
      $this->layout = false;
    }
    else{
      $this->layout = $layout ?: LAYOUT;
    }
  }

  public function render($data){
    $viewfile = APP ."/views/{$this->prefix}{$this->controller}/{$this->view}.php";
    if(is_file($viewfile)){
      ob_start();
      require_once $viewfile;
      $content = ob_get_clean();
    }
    else{
      throw new \Exception("Не найден вид  {$viewfile}",500);
    }
    if(false !== $this->layout){
      $layoutFile = APP . "/views/layouts/{$this->layout}.php";
      if(is_file($layoutFile)){
        require_once $layoutFile;
      }
      else{
        throw new \Exception("Шаблон {$this->layout} не найден",500);
      }
    }
  }
  public function getMeta(){
    $output = "<title>" . $this->meta['title'] .  "</title>" .PHP_EOL;
    $output .= '<meta name="description" content="' . $this->$meta['description'] . '">' .PHP_EOL;
    $output .= '<meta name="keywords" content="' . $this->$meta['keywords'] . '">' .PHP_EOL;
    return $output;
  }
}

Answer 1

Вы обращаетесь к свойству объекта анонимно через $this->$meta, когда оно у вас определено public $meta, замените ваш метод на этот:

public function setMeta($title = '', $description = '', $keywords = ''){
    $this->meta['title'] = $title;
    $this->meta['description'] = $description;
    $this->meta['keywords'] = $keywords;
}

Вы обращались $this->$meta, переменной $meta в методе setMeta() не было объявлено и судя по всему в глобальной видимости тоже - и вообще так делать вам не нужно было(специально ее где-то определять). Напомню, что данное обращение $this->$meta является анонимным, или "magic access", потому что вы не знаете что лежит в переменной $meta, там может лежать значение 'trump' и получается что вызываете $this->trump.

Вам не имеет смысла определять переменную dsa, потому что метод setMeta() ничего не возвращает(void). Можете просто ее убрать:

public function indexAction()
{
    $this->setMeta('Главная страница','Мой суперский сайт', 'keyowrds');
}

<?=$content; ?> - ; необязательно ставить, в таких случаях она мозолит глаза и ухудшает читаемость.

READ ALSO
Как сохранить порядок подстрок? (React+PHP)

Как сохранить порядок подстрок? (React+PHP)

Задача "Как сохранить порядок отображения подстрок"!

107
Docker: invalid reference format

Docker: invalid reference format

Всем приветТолько начал изучать Docker

96
Dependency Injection Container

Dependency Injection Container

Подскажите пожалуйста, при использовании DI-контейнера возникло несколько вопросов:

121