#php #html #model-view-controller
#php #HTML #модель-представление-контроллер
Вопрос:
мой контроллер
class product extends Controller
{
function __construct()
{
}
public function index($id)
{
$productInfo = $this->model->productInfo($id);
print_r($productInfo);
$this->view('product/index.php');
}
}
?>
моя модель
class model_product extends Model
{
function __construct()
{
parent::__construct();
}
function productInfo($id)
{
$sql = 'select * from tbl_product where id=:x ';
$stmt = self::$conn->prepare($sql);
$stmt->bindParam(':x', $id);
$stmt->execute();
$result = $stmt->fetch();
return $result;
}
}
app.php
class App{
public $controller='index';
public $method='index';
public $params= [];
function __construct()
{
if(isset($_GET['url'])){
$url=$_GET['url'];
$url=$this->parseUrl($url);
$this->controller=$url[0];
unset($url[0]);
if (isset($url[1]))
{
$this->method=$url[1];
unset($url[1]);
}
$params=array_values($url);
}
$controllerUrl='controlls/'.$this->controller. '.php.';
if (file_exists($controllerUrl)){
require ($controllerUrl);
$object=new $this->controller;
$object->model($this->controller);
if(method_exists($object,$this->method))
call_user_func_array([$object,$this->method],$this->params);
}
}
function parseUrl($url){
$url=filter_var($url,FILTER_SANITIZE_URL);
$url=rtrim($url,'/');
$url=explode('/',$url);
return $url;
}
он показывает эту ошибку
Неустранимая ошибка: неперехваченный ArgumentCountError: Слишком мало аргументов для работы product::index(), 0 передано в C:xampphtdocshermesmvccoreapp.php в строке 40 и ровно 1 ожидается в C:xampphtdocshermesmvccontrollsproduct.php:14 Трассировка стека: #0 C:xampphtdocshermesmvccoreapp.php (40): продукт-> индекс() #1 C:xampphtdocshermesmvcindex.php (9): Приложение->__построить() #2 {main} добавлено C:xampphtdocshermesmvccontrollsproduct.php в строке 14
Комментарии:
1. Это означает, что когда вы вызываете свою функцию index, вы не предоставляете никаких аргументов. Или это null. Он ожидает, что у вас будет аргумент, который вы задаете
index($id)
. Как вы вызываете функцию index?2. Если вы покажете нам строку 40 из app.php , мы, вероятно, сможем оказать вам более конкретную помощь
3. вызов_user_func_array([$object,$this->метод],$this-> параметры); это строка 40 моего app.php
4. Хорошо, я был неправ… нужно видеть больше строк, чем это. Я не могу сказать, что там происходит. Но похоже, что, возможно, $this->params — это либо пустой массив, либо вообще не массив. Это должен быть массив с ровно одним значением.
5. хорошо, я добавил app.php и, кстати, я еще не вызываю индекс функции в своем файле просмотра, я просто вставляю таблицы из своей базы данных в php, и когда я делаю $id равным одному из идентификаторов моих продуктов, ошибка исчезает, и она показывает мне массив
Ответ №1:
Замените в вашем app.php $params=array_values($url);
по $this->params=array_values($url);
Потому что, если вы не установите $this->params
в construtor , он останется пустым. Очень похоже на то, что вы сделали для метода и контроллера.