Я изучаю prestashop для будущего проекта. Я следую документации по созданию модуля
https://devdocs.prestashop.com/1.7/modules/concepts/hooks/use-hooks-on-modern-pages/
Но когда я выполняю все шаги, у меня появляется эта ошибка:
Attempted to load class "ProductRepository" from namespace "Foo\Repository". Did you forget a "use" statement for another namespace?
моя структура такова:
Модуль
- foo
- config
services.yml
- src
- Repository
ProductRepository.php
- foo.php
мой services.yml
# modules/foo/config/services.yml
services:
product_repository:
class: \Foo\Repository\ProductRepository
arguments: ['@doctrine.dbal.default_connection', '%database_prefix%']
мой ProductRepository.php
<?php
// src/Repository/ProductRepository.php
namespace Foo\Repository;
use Doctrine\DBAL\Connection;
class ProductRepository
{
/**
* @var Connection the Database connection.
*/
private $connection;
/**
* @var string the Database prefix.
*/
private $databasePrefix;
public function __construct(Connection $connection, $databasePrefix)
{
$this->connection = $connection;
$this->databasePrefix = $databasePrefix;
dump('ok');
}
/**
* @param int $langId the lang id
* @return array the list of products
*/
public function findAllbyLangId($langId)
{
$prefix = $this->databasePrefix;
$productTable = "${prefix}product";
$productLangTable = "${prefix}product_lang";
$query = "SELECT p.* FROM ${productTable} p LEFT JOIN ${productLangTable} pl ON (p.`id_product` = pl.`id_product`) WHERE pl.`id_lang` = :langId";
$statement = $this->connection->prepare($query);
$statement->bindValue('langId', $langId);
$statement->execute();
return $statement->fetchAll();
}
}
мой foo.php
<?php
if (!defined('_PS_VERSION_')) {
exit;
}
class Foo extends Module
{
public function __construct()
{
$this->name = 'foo';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Jordan NativeWeb';
$this->need_instance = 0;
$this->ps_versions_compliancy = [
'min' => '1.6',
'max' => _PS_VERSION_
];
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Foo');
$this->description = $this->l('2eme module');
$this->confirmUninstall = $this->l('Etes vous sûr de vouloir supprimer ce module ?');
if (!Configuration::get('MYMODULE_NAME')) {
$this->warning = $this->l('Aucun nom trouvé');
}
}
/**
* Module installation.
*
* @return bool Success of the installation
*/
public function install()
{
return parent::install() && $this->registerHook('displayDashboardToolbarIcons');
}
/**
* Add an "XML export" action in Product Catalog page.
*
*/
public function hookDisplayDashboardToolbarIcons($hookParams)
{
if ($this->isSymfonyContext() && $hookParams['route'] === 'admin_product_catalog') {
$products = $this->get('product_repository')->findAllByLangId(1);
dump($products);
}
}
public function uninstall()
{
if (!parent::uninstall() ||
!Configuration::deleteByName('MYMODULE_NAME')
) {
return false;
}
return true;
}
}
Вы видите что-то плохое и может объяснить ошибку? Пытаюсь, но ничего не нахожу ... Я заранее благодарю вас
Спасибо за ваш ответ. Если я добавлю «пространство имен Foo;» в моем foo.php моя IDE не принимает мой extends "Module", и когда я загружаю страницу, она не работает
Вы очистили приложение / кеш?
Да, используя php bin / console cache / clear
Здравствуйте, вы решили?
Здравствуйте, нет. Я упал ... документация не самая лучшая, что я видел ...
ок если найду решение, скажу тебе
У вас такая же проблема? Я создал свой собственный модуль без документации, но ... мне любопытно узнать, как это решено. Спасибо
Я сделал это :) Теперь я объясню вам, как это сделать для использования пространств имен




Для решения этой проблемы необходимо использовать автозагрузку и композитор.
Композитор:
Установите композитор, если у вас его нет https://getcomposer.org/
Создайте composer.json
Создайте внутри папки модуля файл с именем composer.json и вставьте приведенный ниже код.
{
"autoload": {
"psr-4": {
"Carbo\\": "classes/"
}
}
}
в этом случае карбо - это мое пространство имен, а классы - это папка, в которой я буду создавать свои классы
Использовать терминал
откройте свой терминал, перейдите в папку с модулем и запустите эту команду:
php composer.phar dump-autoload -a
Это создаст папку vendor с внутренней папкой композитора и файлом autoload.php.
в autoload_psr4.php внутри папки композитора
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Carbo\\' => array($baseDir . '/classes'),
);
Как использовать в приложении
Создайте свой класс в: classes / Helper / Display.php
<?php
namespace Carbo\Helper;
class Display
{
public static function hello($string){
return $string;
}
}
откройте свой основной файл и включите autoload.php перед объявлением класса
require_once __DIR__.'/vendor/autoload.php';
теперь вы можете включить свои классы
use Carbo\Helper\Display; // Namespace - folder - class name
И, наконец, используйте это
Display::hello("Hello there")
Чтобы узнать больше об этом, вы можете следовать этому руководству: https://thewebtier.com/php/psr4-autoloading-php-files-using-composer/
Надеюсь будет вам полезен
Спасибо, я понимаю, почему это не работает. По умолчанию в новой установке prestashop композитор не установлен. На самом деле это похоже на стандартную установку Symfony. Я не пробовал установить композитор, пока вы не сказали мне ... большое спасибо :)
Разве вам не нужно пространство имен для
Fooвfoo.php?