Маршрутизація підпапки контролера Laravel


95

Я новачок у Laravel. Щоб спробувати підтримати свою програму організованою, я хотів би помістити свої контролери в підпапки папки контролера.

controllers\
---- folder1
---- folder2

Я намагався перейти до контролера, але laravel його не знаходить.

Route::get('/product/dashboard', 'folder1.MakeDashboardController@showDashboard');

Що я роблю не так?

Відповіді:


114

Для Laravel 5.3 вище:

php artisan make:controller test/TestController

Це створить testпапку, якщо вона не існує, а потім створить TestControllerвсередині.

TestController буде виглядати так:

<?php
namespace App\Http\Controllers\test;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class TestController extends Controller
{
    public function getTest()
    {
        return "Yes";
    }
}

Потім ви можете зареєструвати свій маршрут таким чином:

Route::get('/test','test\TestController@getTest');

чи є спосіб досягти вищезазначеного для laravel 4.2
Сагар Арора

11
php artisan make:controller test\TestControllerстворює testTestController.php, тоді як php artisan make:controller 'test\TestController'працює. (Зверніть увагу на цитати) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Амріт Шрешта

73

Додайте свої контролери у свої папки:

controllers\
---- folder1
---- folder2

Створіть свій маршрут, не вказуючи папку:

Route::get('/product/dashboard', 'MakeDashboardController@showDashboard');

Біжи

composer dump-autoload

І спробуйте ще раз


я думаю, вам artisan dump-autoloadтеж потрібно чи цього composer dump-autoloadдостатньо?
Рейкюшин

1
Для / контролерів, просто композитор. Але якщо у вас щось ClassLoader::addDirectoriesє, а композитора немає, вам теж знадобиться ремісник.
Антоніо Карлос Рібейру,

Я раптом згадав, що зіткнувся з подібним
явищем

composer dump-autoloadпрацюй і на мене. Якщо ви використовуєте ОС Windows, ви можете використовувати файл .bat для запуску, composer dump-autoloadа не вводити CMD щоразу. Це те, що я використовую: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa

7
Що робити, якщо у нас є два контролери з однаковим іменем у forlder1 і folder2? Наприклад: admin / PostsController.php та frontend / PostsController.php
zennin

50

Для тих, хто використовує Laravel 5, вам потрібно встановити простір імен для контролера в підкаталозі (Laravel 5 все ще розробляється, і зміни відбуваються щодня)

Щоб отримати структуру папок, наприклад:

Http
----Controllers
    ----Admin
            PostsController.php
    PostsController.php

файл простору імен Admin \ PostsController.php приблизно так:

<?php namespace App\Http\Controller\Admin;

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Тоді ваш маршрут для цього:

$router->get('/', 'Admin\PostsController@index');

І, нарешті, не можна робити ні композитора, ні ремісника

composer dump-autoload

або

php artisan dump

Працював у мене, станом на 23.01.15. Це може змінитися пізніше, оскільки L5 ще не вийшов.
sehummel

Дякую за цей маленький шматочок. У LV4 ви змогли пропустити 'use App \ Http \ Controllers \ Controller;' , оскільки ви розширили BaseController, який успадковується безпосередньо від Controller. Це не так у LV5, оскільки він поширює контролер безпосередньо, і автозавантаження PSR-4 має знати, де знайти контролер.
Лайонел Моррісон,

4
@user? php простір імен App \ Http \ Controller \ Admin; повинен бути Контролером [s] з кінцем
Свен ван ден Бугаарт

Це спрацювало для мене, з тим застереженням, що мені довелося додати "-o" до висловлювання композитора, наприклад: composer dump-autoload -o
Скотт Байерс

Це не спрацювало у мене, повідомлення про помилку тепер каже, що App\Http\Controllers\Auth\Controllerне знайдено, чому додається слово Controllerтам і втрачається власне ім'я контролера? Я думаю, це коса риса. -oне допомогло.
блам

15

Для ** Laravel 5 або Laravel 5.1 LTS обидва **, якщо у вас кілька контролерів у папці адміністратора, Route::group буде вам дуже корисно. Наприклад:

Оновлення : працює з Laravel 5.4

Структура моєї папки:

Http
----Controllers
    ----Api
          ----V1
                 PostsApiController.php
                 CommentsApiController.php
    PostsController.php

PostAPIController:

<?php namespace App\Http\Controllers\Api\V1;

use App\Http\Requests;
use App\Http\Controllers\Controller;   
use Illuminate\Http\Request;

class PostApiController extends Controller {  
...

У My Route.php я встановив namespaceгрупу на Api\V1і загалом це виглядає так:

Route::group(
        [           
            'namespace' => 'Api\V1',
            'prefix' => 'v1',
        ], function(){

            Route::get('posts', ['uses'=>'PostsApiController@index']);
            Route::get('posts/{id}', ['uses'=>'PostssAPIController@show']);

    });

Для отримання детальної інформації про переміщення для створення підпапки перейдіть за цим посиланням .


1
Для Laravel 5.4 це єдине рішення, яке я знайшов на сьогодні.
mosh442

Ідеальне рішення
Алі Аділ

Справді ідеально!
Rytis Dereskevicius

Ігровий чейнджер ;-)
Страбек

9

1. створіть свою підпапку так само, як наступні:

app
----controllers
--------admin
--------home

2. налаштуйте свій код в app / routes.php

<?php
// index
Route::get('/', 'Home\HomeController@index');

// admin/test
Route::group(
    array('prefix' => 'admin'), 
    function() {
        Route::get('test', 'Admin\IndexController@index');
    }
);
?>

3. напишіть sth в app / controllers / admin / IndexController.php, наприклад:

<?php
namespace Admin;

class IndexController extends \BaseController {

    public function index()
    {
        return "admin.home";
    }
}
?>

4. перейти на ваш сайт, наприклад: localhost / admin / test ви побачите "admin.home" на сторінці

ps: Будь ласка, ігноруйте мою бідну англійську


2
Використання простору імен дозволяє уникнути зіткнення імен. +1
FDisk

6

Щойно знайшов спосіб, як це зробити:

Просто додайте шляхи до /app/start/global.php

ClassLoader::addDirectories(array(

    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/controllers/product',
    app_path().'/models',
    app_path().'/database/seeds',

));

5
Неправильно. Оскільки / controllers вже знаходиться в базі composer.json Laravel, все, що знаходиться нижче, автоматично завантажується автоматично. Вам не потрібно додавати / контролери / продукт на ваш global.php.
Антоніо Карлос Рібейру,

1
@AntonioCarlosRibeiro У мене виникла проблема зі спробою вставити моделі в папки, але скидання композиційних та ремісничих автозавантажень, здається, не працює. ви повинні помістити їх на composer.json або на global.php
reikyoushin

2
Це легко перевірити: після запуску composer du відкрийте vendor / composer / autoload_classmap.php і там повинен бути вказаний ваш клас.
Антоніо Карлос Рібейру,

6
php artisan make:controller admin/CategoryController

Тут admin - це підкаталог під app / Http / Controllers, а CategoryController - це контролер, який ви хочете створити всередині каталогу


6

У Laravel 5.6, якщо припустити, що ім’я вашої підпапки ' Api :

У вашому контролері вам потрібні ці два рядки:

namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;

А у файлі маршруту api.phpвам потрібно:

Route::resource('/myapi', 'Api\MyController');

5

Я використовую Laravel 4.2. Ось як я це роблю: у
мене така структура каталогів:
app
--controllers
---- admin
------ AdminController.php

Після того, як я створив контролер, я помістив у composer.json шлях до нового каталогу адміністратора:

"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/controllers/admin",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
]
}, 

Далі я побіг

composer dump-autoload

і потім

php artisan dump-autoload

Тоді у маршрути.php у мене є контролер, включений так:

Route::controller('admin', 'AdminController');

І все працює нормально.


У мене працює, і мені потрібно лише запустити 'composer dump-autoload -o'
phuang07

В будь-якому випадку я використовую також php artisan dump-autoload.
Тодор Тодоров

5

1) Ось як ви можете організувати свій додаток:

Кожен файл маршруту ( web.php, api.php...) оголошується у map()методі, у файлі

\app\Providers\RouteServiceProvider.php

Коли ви зіставляєте файл маршруту, ви можете встановити ->namespace($this->namespace)для нього його, ви побачите його там серед прикладів.

Це означає, що ви можете створити більше файлів, щоб зробити ваш проект більш структурованим!

І встановіть різні простори імен для кожного з них.

Але я віддаю перевагу набору empty stringдля простору імен""

2) Ви можете налаштувати свої контролери на маршрутизацію в рідному php-режимі, див. Приклад:

Route::resource('/users', UserController::class);
Route::get('/agents', [AgentController::class, 'list'])->name('agents.list');

Тепер ви можете двічі клацнути імена контролерів в IDE, щоб швидко і зручно туди дістатися.


Краща відповідь! Повністю узгоджується з Laravel і побудований на основі того, що фреймворк вже пропонує нестандартно.
jfoliveira

4

Якщо ви використовуєте Laravel 5.3 або новішу версію, немає необхідності входити в стільки складності, як сказано в інших відповідях. Просто використовуйте команду artisan за замовчуванням для створення нового контролера. Наприклад, якщо я хочу створити Userконтролер у Userпапці. Я б набрав

php artisan make:controller User/User

У маршрутах,

Route::get('/dashboard', 'User\User@dashboard');

робити саме це було б непогано, і тепер на localhost / dashboard знаходиться ця сторінка.

Сподіваюся, це допомагає.


3

Я думаю, щоб тримати контролери для Admin та Front в окремих папках, простір імен буде працювати добре.

Будь ласка, зверніться до наведеної нижче структури каталогів Laravel, яка для мене чудово працює.

app
--Http
----Controllers
------Admin
--------DashboardController.php
------Front
--------HomeController.php

Маршрути у файлі "routes / web.php" будуть такими, як показано нижче

/* All the Front-end controllers routes will work under Front namespace */

Route::group(['namespace' => 'Front'], function () {
    Route::get('/home', 'HomeController@index');
});

А для розділу адміністратора це буде виглядати так

/* All the admin routes will go under Admin namespace */
/* All the admin routes will required authentication, 
   so an middleware auth also applied in admin namespace */

Route::group(['namespace' => 'Admin'], function () {
    Route::group(['middleware' => ['auth']], function() {            
        Route::get('/', ['as' => 'home', 'uses' => 'DashboardController@index']);                                   
    });
});

Сподіваюся, це допомагає !!


1

Нещодавно у мене була ця проблема з laravel 5.8, але я не розумію, що повинен правильно визначати контролер, як показано нижче:

php artisan make:controller SubFolder\MyController  // true

Не так:

php artisan make:controller SubFolder/MyController  // false

Тоді ви можете отримати доступ до контролера у маршрутах / web.php таким чином:

Route::get('/my', 'SubFolder\MyController@index');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.