Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Прохожу лекцию уроков по ларавел Ссылка на лекцию в youtube
Все делаю у себя на локалхосте (ubuntu под win10).
Лекция старая, и автор использовал примерно Ларавел 5, а под 8 не все как у него и на неком уроке 23 столкнулся с проблемой - ларавел не видит мой обычный простой класс.
Согласно урока добавил папку Classes и файл Basket.php в папку app, все прописал где надо (namespace в файле класса, use в контроллере), а выдает ошибку - класс не найден, неясно в чем проблема.
Файл класса
Использование в контроллере
Ошибка в браузере
composer dump-autoload - делал, не помогает
Может кто-то подскажет чего еще не так? Запарился уже битый день ищу решения.
судя по статья в интернете - вроде все правильно даже для 8 версии ларавел такой подход создания классов, а почему-то не пашет.
Пробовал менять имя файла + имя класса, папку файла - ничего не помогает. При этом среда VS-CODE видит класс в контроллере, а при запуске он почему-то выдает ошибку.
Не в сети
Вообщем решил проблему (если можно так сказать), методом создания модели через artisan.
php artisan make:model Basket
И все что надо поместил в нее, вообщем-то работает нормально. Конечно это не свой какой-то класс в произвольном месте, но дело делает и то хорошо, чем ничего.
Не в сети
Что-то тут не так. Перепроверь пути и название класса на предмет ошибок (например кирилица).
После composer du всё должно было заработать.
Это необходимо победить! Как же ты будешь писать свои сервис-классы?
Все делаю у себя на локалхосте (ubuntu под win10).
В этом также может быть причина. Хочешь писать качественный код - просто бери linux и пиши.
Не в сети
Перепроверь пути и название класса на предмет ошибок (например кирилица).
Да все правильно написано было, я же говорю - 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)
Не в сети
composer du после создания нового класса сделал?
Какая версия composer/Laravel/php ?
Не в сети
и еще одна интересная вещь:
если в файле контроллера я пробую подключить файл с классом наприямую через 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 (хотя вообщем-то редактор исправно работает, и сигналит, если запись не удалась). Типа может ларавел создает какую-то свою область с файлами, добавляя туда все что ему нужно, а остальное просто не видит или может какой кэш еще барахлит?
Не в сети
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
Не в сети
Обнови композер до версии 2. (последняя 2.2.5)
Не в сети
Реально вы думаете это должно было помочь?
обновил до 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!
эффект все равно нулевой.
Не в сети
Ты уверен, что правильно меня понял про обновление версии самого композера, а не 'composer update' ?
Не в сети
Ты уверен, что правильно меня понял про обновление версии самого композера, а не 'composer update' ?
Composer version 2.2.5 2022-01-21 17:25:52
https://coderteam.ru/blog/obnovlyaemsya … na-ubuntu/ - делал по этой инструкции (self-update не помогло, пришлось через файлик).
Не в сети
Есть положительный результат ?
Не в сети
Есть положительный результат ?
пока нет, об этом я и говорил - сказав, что результат от обновы компосера - нулевой.
Похоже проблема в чем-то другом.
Не в сети
У меня на Ubuntu с Laravel 8 нет проблем с автозагрузкой и видимостью новых классов. Разверни с нуля новый проект, не знаю, на VDS и протестируй.
Для сервис-классов рекомендую использовать название папок Services или UseCases.
Не в сети
В рамках одного из уроков, проект на хостинг я выставлял (с тестовым периодом был хостинг, правда тогда еще этой проблемы не было или не стал тестировать), сейчас это делать, пока смысла нет, да и я дальше уроки прохожу на локалке, вообщем-то заплатка решение есть (размещать классы как модели) и ладно. Конечно это дичь, при освоении ларавела, такое дело обнаружить, но вообщем-то терпимо, не так много пока классов своих отдельных клепается (всего пока один есть), остальные вообщем через artisan добавляются в "системные" папки.
Если вы говорите, что вообщем-то все нормально с классами у ларавел 8, то волноваться думаю не о чем.
Возможно чтобы решить проблему, нужен именно специалист, который эту тему хорошо знает и возможно сам проходил через такое.
Спасибо вам за ваше беспокойство.
Не в сети
<? - не делайте так. современные версии пхп по умолчанию не используют короткие теги. а раз интерпретатор не воспринимает текст за ним как код пхп, то и класс не будет объявлен.
Вообщем решил проблему (если можно так сказать), методом создания модели через artisan.
в этом случае файл создаётся с нормальными тегами.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
но стоит изменить букву 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.
Не в сети
<? - не делайте так. современные версии пхп по умолчанию не используют короткие теги. а раз интерпретатор не воспринимает текст за ним как код пхп, то и класс не будет объявлен.
Ну надо же, такого я не ожидал - и правда стоило только <?php сделать и заработало. А с каких это пор современные версии php стали забивать на короткие тэги? вроде бы когда то наоборот было, новые версии стали короткие поддерживать (я правда не так хорошо знаком с историей пхп), а счас получается обратная мода пошла?
Спасибо вам за точный ответ, ну не подумал бы наверное никогда что в этом может быть проблема. И сколько читаю про программированию и справки всякие, но такого не видел.
Про регистро зависимые системы это я немного в курсе, вообщем-то и юзал как пример для сравнения ошибки, которая с моим классом была.
Спасибо за советы, может пригодятся.
А я думал где-то в настройках ларавел у меня косяк или от сгенеренных файлов.
У меня как-то недавно был заказ - кое-что сделать на ларавел - знаний практически очень мало было по этой системе, разок только что-то ковырялся с ней, но этот сайт попался вообще "дикий" для меня - там у него установлена еще какая то система - apiato/ship и кажется еще что-то - которую я вообще ни разу не видел, но которая несколько структуру папок-файлов изменяет:
https://prnt.sc/26k3m4t
(явно не стандартная структура ларавела - какие-то типа контейнеры, в которых типа свои сайты или блоки - модели, вьюхи и прочее)
вообщем изучив вкратце кучу всяких доков включая и по юникс системе, кое-как решил задачу - людям надо, обратиться им было некуда, а я подзаработать был не против. Я обычно по битрикс сайтам раньше занимался несколько лет и ларавел внову был для меня, но осилил однако, Слава Богу.
Что самым необычным было после битрикса, так это то что некие команды laravel - типа artisan могут изменить вообще папку public. Т.е. берутся ресурсы из resources, как-то компуются и пишутся в public. - это было вообще жестью, потому что у тех была копия сайта для правок, а у нее в линуксе с доступами какие-то ограничения были, так что даже нельзя было скомпилировать, так и правил в двух местах - в основном это js касается - он как-то генерил совсем другие файлы, объединял их, переменные другие делал, вообщем я всего не понял, интуитивно и несколько понимая код добавил своих правок, благо их было не особо много.
Я даже переносил сайт на другой хостинг где с доступами было просторнее, но перенос с него не очень удобно было делать, приходилось куски кода переносить.
Вот и решил подучить ларавел - чтоб если еще будут такие задачи, чтобы быть более вооруженным инструментарием, а то вообще прям как боевое крещение новичка было (хоть в программировании давно уже не новичок). Помогло несколько знание CodeIgniter - он похож чем-то смахивает на ларавел, а с ним я дела уже вел, поэтому более менее смог сориентироваться где что найти, добавить изменить в ларавеле, и по командам терминала уже тоже доводилось что-то делать.
Не в сети
Ну надо же, такого я не ожидал - и правда стоило только <?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 иногда включают локально, но всегда рекомендовалось использовать полную версию. Ну, и на <?= ?> это не влияет, она всегда работает.
Не в сети
спасибо и за ваш ответ, не очень правда ясно почему именно так, а не иначе, хоть и документацию вы указали - но что-то не доходит чем же неугодна другая запись (наверное надо более простое объяснение).
Вообщем-то хватило, того, что надо просто писать полный тэг ...
Изменено SergRom (01.04.2022 12:22:40)
Не в сети