Prestashop 1.7.4 - Ошибка модуля с пространством имен

Я изучаю 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?

Rafael 22.10.2018 18:37

Спасибо за ваш ответ. Если я добавлю «пространство имен Foo;» в моем foo.php моя IDE не принимает мой extends "Module", и когда я загружаю страницу, она не работает

Rocket 22.10.2018 20:29

Вы очистили приложение / кеш?

sadlyblue 23.10.2018 11:17

Да, используя php bin / console cache / clear

Rocket 23.10.2018 22:03

Здравствуйте, вы решили?

Gabriele Carbonai 17.11.2018 13:53

Здравствуйте, нет. Я упал ... документация не самая лучшая, что я видел ...

Rocket 17.11.2018 13:58

ок если найду решение, скажу тебе

Gabriele Carbonai 17.11.2018 14:04

У вас такая же проблема? Я создал свой собственный модуль без документации, но ... мне любопытно узнать, как это решено. Спасибо

Rocket 17.11.2018 14:06

Я сделал это :) Теперь я объясню вам, как это сделать для использования пространств имен

Gabriele Carbonai 17.11.2018 15:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
2
9
2 251
1

Ответы 1

Для решения этой проблемы необходимо использовать автозагрузку и композитор.

Композитор:

Установите композитор, если у вас его нет 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;
    }
}
  • пространство имен: Carbo
  • Папка: Помощник
  • Имя класса: Дисплей

откройте свой основной файл и включите 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. Я не пробовал установить композитор, пока вы не сказали мне ... большое спасибо :)

Rocket 17.11.2018 17:15

Другие вопросы по теме