@gallantalex

Пространство имен и подключение класса?

Начал делать веб-приложение на Slim.
Не могу понять, почему не работает пространство имен.
В папке Vendor есть стандартный autoload.php. В index.php я его подключаю через require. Теперь я создаю класс ClientsController в файле classes/ClientsController.php и объявляю пространство имен Controllers. Затем в вызывающем файле прописываю use Controllers as Contrl и вызываю
$myControl = new Contrl\ClientsController;
И мне пишется:
Fatal error: Class 'Controllers\ClientsController' not found in C:\xampp\htdocs\goodfood\public\index.php on line 20
Что именно я делаю не так?
  • Вопрос задан
  • 333 просмотра
Решения вопроса 1
@pudovMaxim
web-developer
Юрий верно говорит, только в Вашем случае надо не "App: src/" папку, а "App: classes/", т.е. корень ваших исходников. И расположить файлы в соответствии указанного PSR-0. (www.php-fig.org/psr/psr-0 )
Также можно воспользоваться PSR-4 (www.php-fig.org/psr/psr-4 ) там чуток другие правила.
Я, например делаю так:
"autoload": {
    "psr-4": {
      "Appname\\": "src/"
    }
  }

Соответственно код лежит в папке src со следующей структурой (Это, кстати, как раз Silex проект.):
src/
--Appname/
----Controller/
------IndexController.php


В контроллере будет namespace Appname\Controller;
А использование его как use Appname\Controller\IndexController as Control;

и еще помогает обновить автоловад composer dump-autoload -o
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
riky
@riky
Laravel
в файле composer.json надо автолоад прописать.
"autoload": {
        "psr-0": {
            "App": "src/"
        }
    },

и обновить
composer update
все классы в неймспейсе App будут загружаться из папки src.
Ответ написан
@gallantalex Автор вопроса
Еще один небольшой непонятный момент:
Почему у меня все работает в файле public/index.php:
use Controller\ClientsController;

$myControl = new ClientsController();
$myControl->hello();

а если я подключу вместо этой иницилизации вспомогательный файл с аналогичным кодом:
require "../src/routes/all.php";
То в нем класс ClientsController не находится? По сути код файла all.php вставляется в index.php и при этом все должно работать нормально, неужели путь влияет на это? В чем подвох?
Структура проекта:
-public/
--index.php
-src/
--routes/
---all.php
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы