За последние 24 часа нас посетили 17425 программистов и 1604 робота. Сейчас ищут 966 программистов ...

Не получается использовать контроллер из подкаталога в Laravel 5.5

Тема в разделе "Laravel", создана пользователем xintrea, 29 мар 2019.

Метки:
  1. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Что-то я совсем в пятницу вечером затупил.

    Вот есть у меня контроллер который лежит по такому пути:

    Код (Text):
    1.  
    2. /app/Http/Controllers/MoveController.php
    И я могу его использовать так:

    Код (Text):
    1.  
    2. Route::get('/home', 'MoveController@index')->name('home');
    Но мне нужно разместить этот контроллер в подкаталоге. Я перемещаю его в подкаталог personalArea:

    Код (Text):
    1.  
    2. /app/Http/Controllers/personalArea/MoveController.php
    И пробую его использовать так:

    Код (Text):
    1.  
    2. Route::get('/home', 'personalArea\MoveController@index')->name('home');
    И мне в ответ ошибка:

    Код (Text):
    1.  
    2. Class App\Http\Controllers\personalArea\MoveController does not exist
    Я пробовал в качестве разделителя и "." и "/", но толку никакого. В чем проблема?
     
  2. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    не надо так делать. Положил в подкаталог, а используешь как обычно. В общем верни роутер как был. Неймспейс - это не путь "по папочкам". У него своя логика, которая к папкам практически отношения не имеет.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  4. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Так как правильно делать то?
    --- Добавлено ---
    По вашей ссылке на доку Laravel аписано:
    Тут ничего про контроллер в подкаталоге не сказано. Тут только про организацию имен в namespace.

    А как пользовать контроллер в подкаталоге - не пойму.

    И да, я пробовал прописать в классе контроллера так:
    Код (Text):
    1.  
    2. // namespace App\Http\Controllers;
    3. namespace App\Http\Controllers\personalArea;
    4.  
    5. use Illuminate\Http\Request;
    6.  
    7. class MoveController extends Controller
    8. {
    Но толку от этого тоже нет.
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Это должно было сработать. Видимо какое-то ещё условие. Какая ОС?
    --- Добавлено ---
    Поэтому дал первую ссылку, Laravel следует PSR-4
    --- Добавлено ---
    Я бы залез отладчиком в автозагрузчик, и посмотрел, чего он пытается искать.
     
  6. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    Debian Linux 9 Stable


    Ох, как сложно... Как это делать?
     
  7. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    vendor/composer/ClassLoader.php - вот этот файлик, смотришь его отладчиком.
    В качестве предположения, у Laravel все неймспейсы контроллеров с большой буквы, ты сделал с маленькой. Может Laravel где преобразует таки букву в большую... Точно не знаю, я просто всегда следовал большой букве, и у меня проблемы такой никогда с Laravel не возникало.
    --- Добавлено ---
    Так же попробуй команду
    Код (Text):
    1. composer dump-autoload
    , чтоб обновить кеш композера.
     
  8. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
    В общем нашел в чем проблема была.

    Когда прописываю namespace App\Http\Controllers\personalArea, я выхожу из namespace App\Http\Controllers, в котором существовал класс Controller.

    Поэтому еще нужно было прописать:

    Код (Text):
    1. use Illuminate\Routing\Controller;
     
  9. xintrea

    xintrea Активный пользователь

    С нами с:
    25 фев 2019
    Сообщения:
    68
    Симпатии:
    0
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Должно было сообщение об ошибке измениться, а ты об этом не написал.
    --- Добавлено ---
    А потом будешь писать статью, как сделать модель в другом каталоге и т.п.? Всё же просто: нужно следовать PSR-0 и PSR-4, если используешь Laravel (ну и не только его, кстати). Читаешь про PSR-4 и становится очевидно, почему нужно прописать namespace при перемещении контроллера.
    --- Добавлено ---
    Вот в официальном руководстве про PSR написано: https://laravel.com/docs/master/structure#the-app-directory
     
    #10 mkramer, 29 мар 2019
    Последнее редактирование: 30 мар 2019
    artoodetoo нравится это.