Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 21.01.2022 08:48:36

Почему-то не подключается свой обычный простой класс в laravel 8

Прохожу лекцию уроков по ларавел Ссылка на лекцию в youtube
Все делаю у себя на локалхосте (ubuntu под win10).
Лекция старая, и автор использовал примерно Ларавел 5, а под 8 не все как у него и на неком уроке 23 столкнулся с проблемой - ларавел не видит мой обычный простой класс.

Согласно урока добавил папку Classes и файл Basket.php в папку app, все прописал где надо (namespace в файле класса, use в контроллере), а выдает ошибку - класс не найден, неясно в чем проблема.
Файл класса
Использование в контроллере
Ошибка в браузере

composer dump-autoload   - делал, не помогает

Может кто-то подскажет чего еще не так? Запарился уже битый день ищу решения.
судя по статья в интернете - вроде все правильно даже для 8 версии ларавел такой подход создания классов, а почему-то не пашет.
Пробовал менять имя файла + имя класса, папку файла - ничего не помогает. При этом среда VS-CODE видит класс в контроллере, а при запуске он почему-то выдает ошибку.

Не в сети

#2 21.01.2022 14:16:57

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Вообщем решил проблему (если можно так сказать), методом создания модели через artisan.

php artisan make:model Basket

И все что надо поместил в нее, вообщем-то работает нормально. Конечно это не свой какой-то класс в произвольном месте, но дело делает и то хорошо, чем ничего.

Не в сети

#3 24.01.2022 21:59:04

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Что-то тут не так. Перепроверь пути и название класса на предмет ошибок (например кирилица).

После composer du всё должно было заработать.

Это необходимо победить! Как же ты будешь писать свои сервис-классы?

Все делаю у себя на локалхосте (ubuntu под win10).

В этом также может быть причина. Хочешь писать качественный код - просто бери linux и пиши.

Не в сети

#4 25.01.2022 08:21:56

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Перепроверь пути и название класса на предмет ошибок (например кирилица).

Да все правильно написано было, я же говорю - VS-CODE редактор кода видит класс, импортирует его, функции доступны у переменной, а именно при запуске - ошибка.
При этом если создавать классы в системных папках (незнаю как их назвать), типа /app/mail/, /app/provider, /app/services, /app/models, /app/request ... наследующиеся от классов ядра, т.е те которые можно через artisan сделать, то они работают.
Может какие-то доступы ларавела к нестандартным (т.е. свойским) папкам заблочены?

Счас еще раз попробовал - сделал папку MyClasses в папке app, в ней файл: MyBasket.php:

<?
namespace App\MyClasses;

use DebugBar\DebugBar;

class MyBasket {
   
    public function start() {
        DebugBar::info("mybasket start");
    }
}

и в контроллере корзины вызов:

<?php
namespace App\Http\Controllers;

use App\Models\Order;
use App\Models\Basket;
use App\Models\Product;
use App\MyClasses\MyBasket;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Barryvdh\Debugbar\Facades\Debugbar;

class BasketController extends Controller
{

    public function basket()
    {
        $myBasket = new MyBasket();
        $myBasket->start();
...

и та же самая ошибка выходит при попытке войти в корзину:

Error
Class 'App\MyClasses\MyBasket' not found
http://localhost/basket

Возможно и то что локалхост на ubuntu из-под винды (wsl), но вроде все остальное пашет на нем - и composer всякие пакеты устанавливает. По сути это вообще простой класс, компосер его даже и не трогает (как мне кажется). А может ларавел уже такой стал, что обычные классы уже не поддерживает, надо писать именно свой сервис, фасад или что там нужно и через него делать вызовы?
надо будет попробовать может быть где на хостинге после чистой установки ларавела заюзать.
А то с этими уроками в настройках что-то менял, какое-то файло хранилища для картинок настраивал, может что-то и задел.

Изменено SergRom (25.01.2022 08:24:35)

Не в сети

#5 25.01.2022 08:33:00

Re: Почему-то не подключается свой обычный простой класс в laravel 8

composer du после создания нового класса сделал?

Какая версия composer/Laravel/php ?

Не в сети

#6 25.01.2022 08:43:57

Re: Почему-то не подключается свой обычный простой класс в laravel 8

и еще одна интересная вещь:
если в файле контроллера я пробую подключить файл с классом наприямую через require:
require __DIR__.'/../../MyClasses/Mybasket.php';
то получаю ошибку:

ErrorException
require(/var/www/testsite/public_html/project/app/Http/Controllers/../../MyClasses/Mybasket.php): failed to open stream: No such file or directory

А если делаю это же с классом модели:
require __DIR__.'/../../Models/Basket.php';
то ошибки нету, но стоит изменить букву M на m в пути и ошибка как у моего класса:

ErrorException
require(/var/www/testsite/public_html/project/app/Http/Controllers/../../models/Basket.php): failed to open stream: No such file or directory

Получается его как будто и нет вовсе, хотя он и есть, проверял по ssh (хотя вообщем-то редактор исправно работает, и сигналит, если запись не удалась). Типа может ларавел создает какую-то свою область с файлами, добавляя туда все что ему нужно, а остальное просто не видит или может какой кэш еще барахлит?

Не в сети

#7 25.01.2022 08:47:21

Re: Почему-то не подключается свой обычный простой класс в laravel 8

composer du после создания нового класса сделал?Какая версия composer/Laravel/php ?

сделал, но это роли не играет в данном деле, как мне кажется, т.к. не стороннее разрешение устанавливал.

Composer 1.10.1 2020-03-13 20:34:27

Laravel Framework 8.74.0

PHP 7.4.3 (cli) (built: Oct 25 2021 18:20:54) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies

Не в сети

#8 25.01.2022 08:52:07

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Обнови композер до версии 2. (последняя 2.2.5)

Не в сети

#9 25.01.2022 09:09:01

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Реально вы думаете это должно было помочь?
обновил до 2 версии, пришлось только обновлять еще debugbar, но толку это никакого не дало - все тоже.

composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: barryvdh/laravel-debugbar
Discovered Package: facade/ignition
Discovered Package: fruitcake/laravel-cors
Discovered Package: laravel/sail
Discovered Package: laravel/sanctum
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 5150 classes

А также выполнил:

sudo php artisan optimize:clear
[sudo] password for star:
Cached events cleared!
Compiled views cleared!
Application cache cleared!
Route cache cleared!
Configuration cache cleared!
Compiled services and packages files removed!
Caches cleared successfully!

эффект все равно нулевой.

Не в сети

#10 25.01.2022 09:11:50

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Ты уверен, что правильно меня понял про обновление версии самого композера, а не 'composer update' ?

Не в сети

#11 25.01.2022 09:25:26

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Ты уверен, что правильно меня понял про обновление версии самого композера, а не 'composer update' ?

Composer version 2.2.5 2022-01-21 17:25:52
https://coderteam.ru/blog/obnovlyaemsya … na-ubuntu/ - делал по этой инструкции (self-update не помогло, пришлось через файлик).

Не в сети

#12 25.01.2022 09:54:21

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Есть положительный результат ?

Не в сети

#13 25.01.2022 10:05:48

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Есть положительный результат ?

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

Не в сети

#14 25.01.2022 10:11:16

Re: Почему-то не подключается свой обычный простой класс в laravel 8

У меня на Ubuntu с Laravel 8 нет проблем с автозагрузкой и видимостью новых классов. Разверни с нуля новый проект, не знаю, на VDS и протестируй.
Для сервис-классов рекомендую использовать название папок Services или UseCases.

Не в сети

#15 25.01.2022 10:32:28

Re: Почему-то не подключается свой обычный простой класс в laravel 8

В рамках одного из уроков, проект на хостинг я выставлял (с тестовым периодом был хостинг, правда тогда еще этой проблемы не было или не стал тестировать), сейчас это делать, пока смысла нет, да и я дальше уроки прохожу на локалке, вообщем-то заплатка решение есть (размещать классы как модели) и ладно. Конечно это дичь, при освоении ларавела, такое дело обнаружить, но вообщем-то терпимо, не так много пока классов своих отдельных клепается (всего пока один есть), остальные вообщем через artisan добавляются в "системные" папки.
Если вы говорите, что вообщем-то все нормально с классами у ларавел 8, то волноваться думаю не о чем.
Возможно чтобы решить проблему, нужен именно специалист, который эту тему хорошо знает и возможно сам проходил через такое.
Спасибо вам за ваше беспокойство.

Не в сети

#16 27.01.2022 12:22:36

Re: Почему-то не подключается свой обычный простой класс в laravel 8

<? - не делайте так. современные версии пхп по умолчанию не используют короткие теги. а раз интерпретатор не воспринимает текст за ним как код пхп, то и класс не будет объявлен.

Вообщем решил проблему (если можно так сказать), методом создания модели через artisan.

в этом случае файл создаётся с нормальными тегами.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#17 27.01.2022 12:32:08

Re: Почему-то не подключается свой обычный простой класс в laravel 8

но стоит изменить букву M на m в пути и ошибка как у моего класса: failed to open stream

дык, в unix-ах файловые системы обычно регистрозависимые! это в винде FAT и NTFS регистр игнорируют. когда прям надо прописать исключение, когда имя папки и класса должны различаться, то прописывают это в composer.json. в ларавель одно такое исключение есть сразу - для папки app.

бывают случаи самообмана, когда класс размещен не там где его будет искать автолоадер (не в той папке или регистр файла/папки не тот) , но ты сделал composer dump и размещение класса сохранилось в специальном кеше. тогда можно работать и не знать, что проблема есть. а она возродится когда ты перенесешь проект куда-то ещё и там кеша нет. очень неприятный случай.

короче, с регистром имен будь осторожен. и всегда обращай внимание на "желтые" предупреждения composer - они подсказки о потенциальных проблемах.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#18 27.01.2022 14:01:29

Re: Почему-то не подключается свой обычный простой класс в laravel 8

<? - не делайте так. современные версии пхп по умолчанию не используют короткие теги. а раз интерпретатор не воспринимает текст за ним как код пхп, то и класс не будет объявлен.

Ну надо же, такого я не ожидал - и правда стоило только <?php сделать и заработало. А с каких это пор современные версии php стали забивать на короткие тэги? вроде бы когда то наоборот было, новые версии стали короткие поддерживать (я правда не так хорошо знаком с историей пхп), а счас получается обратная мода пошла?
Спасибо вам за точный ответ, ну не подумал бы наверное никогда что в этом может быть проблема. И сколько читаю про программированию и справки всякие, но такого не видел.
Про регистро зависимые системы это я немного в курсе, вообщем-то и юзал как пример для сравнения ошибки, которая с моим классом была.
Спасибо за советы, может пригодятся.
А я думал где-то в настройках ларавел у меня косяк или от сгенеренных файлов.
У меня как-то недавно был заказ - кое-что сделать на ларавел - знаний практически очень мало было по этой системе, разок только что-то ковырялся с ней, но этот сайт попался вообще "дикий" для меня - там у него установлена еще какая то система  - apiato/ship и кажется еще что-то  - которую я вообще ни разу не видел, но которая несколько структуру папок-файлов изменяет:
https://prnt.sc/26k3m4t
(явно не стандартная структура ларавела - какие-то типа контейнеры, в которых типа свои сайты или блоки - модели, вьюхи и прочее)
вообщем изучив вкратце кучу всяких доков включая и по юникс системе, кое-как решил задачу - людям надо, обратиться им было некуда, а я подзаработать был не против. Я обычно по битрикс сайтам раньше занимался несколько лет и ларавел внову был для меня, но осилил однако, Слава Богу.
Что самым необычным было после битрикса, так это то что некие команды laravel - типа artisan могут изменить вообще папку public. Т.е. берутся ресурсы из resources, как-то компуются и пишутся в public. - это было вообще жестью, потому что у тех была копия сайта для правок, а у нее в линуксе с доступами какие-то ограничения были, так что даже нельзя было скомпилировать, так и правил в двух местах - в основном это js касается - он как-то генерил совсем другие файлы, объединял их, переменные другие делал, вообщем я всего не понял, интуитивно и несколько понимая код добавил своих правок, благо их было не особо много.
Я даже переносил сайт на другой хостинг где с доступами было просторнее, но перенос с него не очень удобно было делать, приходилось куски кода переносить.
Вот и решил подучить ларавел - чтоб если еще будут такие задачи, чтобы быть более вооруженным инструментарием, а то вообще прям как боевое крещение новичка было (хоть в программировании давно уже не новичок). Помогло несколько знание CodeIgniter - он похож чем-то смахивает на ларавел, а с ним я дела уже вел, поэтому более менее смог сориентироваться где что найти, добавить изменить в ларавеле, и по командам терминала уже тоже доводилось что-то делать.

Не в сети

#19 01.04.2022 11:19:36

Re: Почему-то не подключается свой обычный простой класс в laravel 8

Ну надо же, такого я не ожидал - и правда стоило только <?php сделать и заработало. А с каких это пор современные версии php стали забивать на короткие тэги? вроде бы когда то наоборот было, новые версии стали короткие поддерживать (я правда не так хорошо знаком с историей пхп), а счас получается обратная мода пошла?

Всегда так было:

; This directive determines whether or not PHP will recognize code between
; <? and ?> tags as PHP source which should be processed as such. It is
; generally recommended that <?php and ?> should be used and that this feature
; should be disabled, as enabling it may result in issues when generating XML
; documents, however this remains supported for backward compatibility reasons.
; Note that this directive does not control the <?= shorthand tag, which can be
; used regardless of this directive.
; Default Value: On
; Development Value: Off
; Production Value: Off
short_open_tag = Off

short_open_tag иногда включают локально, но всегда рекомендовалось использовать полную версию. Ну, и на <?= ?> это не влияет, она всегда работает.

Не в сети

#20 01.04.2022 12:22:10

Re: Почему-то не подключается свой обычный простой класс в laravel 8

спасибо и за ваш ответ, не очень правда ясно почему именно так, а не иначе, хоть и документацию вы указали - но что-то не доходит чем же неугодна другая запись (наверное надо более простое объяснение).
Вообщем-то хватило, того, что надо просто писать полный тэг ...

Изменено SergRom (01.04.2022 12:22:40)

Не в сети

Подвал раздела