Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

новые классы в response.php


Recommended Posts

Привет!
Пишу свое дополнение. И все действия происходят в /system/library/response.php
Понадобилось использовать($this->request->get['product_id']) класс request.php.
Как его подключить в response? 
class Response extends Controller выдает 
PHP Fatal error: Call to a member function get() on null in ../system/engine/controller.php on line 10

Надіслати
Поділитися на інших сайтах


Для того чтобы использовать контекст движка в каком-либо классе, нужно передать в него этот самый контекст. Есть и более простое решение, в конце.

 

1. Смотрим где подключается Response; и передаем ему $registry. 

$Response = new Response($registry = false);

2. В классе Response пописываем private $registry; и конструктор, который примет и проверит $registry, а затем назначит $this->$registry = $registry;

 

Здесь обязательно стоит добавить проверку на существование $registry. Т.к. в зависимости от версий движка, инициализация Response может быть в нескольких файла. Например, в каталоге мы добавили передачу $registry, а в admin/index.php ее нет и на странице admin может быть ошибка.

 

3. Получить product_id можно так:

$request = $this->registry->get('request');
$product_id = $request->get['product_id'];

А вообще можно получить все это без внедрения регистра в класс.

$route = isset($_GET['route']) ? $_GET['route'] : (isset($_GET['_route_']) ? $_GET['_route_'] : '');
$product_id = 0;
if ($route == 'product/product'){
	$product_id = (int)$_GET['product_id'];
}

 

Надіслати
Поділитися на інших сайтах

1 минуту назад, halfhope сказал:

Для того чтобы использовать контекст движка в каком-либо классе, нужно передать в него этот самый контекст. Есть и более простое решение, в конце.

 

1. Смотрим где подключается Response; и передаем ему $registry. 


$Response = new Response($registry = false);

 

 

Не особо "красиво".  А вдруг кто то модификаторами тоже так захочет "передать" - будет конфликт
Лучше завести свою кастомную переменную класса 
и в неё передавать registry, а потом из неё вызывать

Надіслати
Поділитися на інших сайтах

22 минуты назад, halfhope сказал:

А вообще можно получить все это без внедрения регистра в класс.

при включенном сео $_GET и $this->request->get разные пространства
 

$this->get = $this->clean($_GET);

 

Надіслати
Поділитися на інших сайтах

  • 2 weeks later...

решил не портить response.php своим кодом. в нем только создаю экземпляр своего класса и вызываю один метод.

как в своем классе использовать например $this->db->query("...") ?
если $db = new DB; то надо все указывать как для нового подключения.
в примерах посмотрел \system\library\openbay\etsy.php там конструкция $this->db->query работает.

Надіслати
Поділитися на інших сайтах


4 минуты назад, stydent сказал:

как в своем классе использовать например $this->db->query("...") ?

Зависит от того, где ваш класс.

Если где-то в system, то в конструкторе делаете:

$this->db = $registry->get('db');

А затем используете, как и везде.

И не забудьте передать в конструктор $registry при создании экземпляра класса.

 

Если же ваш класс в контроллерах, то там это и так будет работать из коробки (если вы наследуетесь от Controller).

Надіслати
Поділитися на інших сайтах


23 часа назад, Dotrox сказал:

Если где-то в system, то в конструкторе делаете:

да у меня он в system/library

Такой способ вызывает PHP Fatal error:  Call to a member function get() on string

class className {
	
	private $registry;
	
	public function __construct($registry) {
		$this->db = $registry->get('db');
	}
.....
}

 

Надіслати
Поділитися на інших сайтах


3 часа назад, stydent сказал:

Такой способ вызывает PHP Fatal error:  Call to a member function get() on string

А где и как вы свой класс инициализируете?

 

2 часа назад, chukcha сказал:

в response нет registry

Так речь же идёт сейчас уже про отдельный класс, в который registry будет передаваться при инициализации.

Змінено користувачем Dotrox
Надіслати
Поділитися на інших сайтах


20 часов назад, Dotrox сказал:

А где и как вы свой класс инициализируете?

 

Так речь же идёт сейчас уже про отдельный класс, в который registry будет передаваться при инициализации.

Видишь?
Т.е. нигде нет registry

Я предлагал добавить сеттер для registry, а можно добавить сеттер и для db

Надіслати
Поділитися на інших сайтах

2 часа назад, stydent сказал:

в /system/library/response.php 


$mc = new className('');
echo $mc->output($output);

 

 

Что я выше написал?

В 18.06.2019 в 13:45, Dotrox сказал:

И не забудьте передать в конструктор $registry при создании экземпляра класса.

А что вы передаёте? Пустую строку!

И если вы свой класс инициализируете в response, то, как уже сказал Чукча, там нет registry, так что вам сначала его нужно передать в response, а затем уже в свой класс.

 

 

2 часа назад, chukcha сказал:

Видишь?
Т.е. нигде нет registry

Его туда передать совсем не проблема.

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.