Маршрутизация подпапок Laravel Controller

62

Я новичок в Laravel. Чтобы попытаться сохранить мое приложение, я хотел бы поместить мои контроллеры в подпапки папки контроллера.

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

Я попытался перейти к контроллеру, но laravel его не нашел.

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

Что я делаю неправильно?

Теги:
laravel-4
laravel-routing

11 ответов

54
Лучший ответ

для Laravel 5.3 выше

php artisan make:controller test/TestController

Это создаст тестовую папку, если она не существует, а затем создаст 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');
  • 0
    Есть ли способ достичь того же самого для Laravel 4.2
  • 8
    php artisan make:controller test\TestController создает testTestController.php, тогда как php artisan make:controller 'test\TestController' работает. (Обратите внимание на цитаты) - Laravel 5.4
Показать ещё 1 комментарий
62

Добавьте свои контроллеры в свои папки:

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

Создайте свой маршрут, не указав папку:

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

Запустить

composer dump-autoload

И попробуйте еще раз

  • 0
    я думаю, что вам нужно artisan dump-autoload тоже или composer dump-autoload достаточно?
  • 1
    Для / контроллеров, просто композитор. Но если у вас есть что-то в ClassLoader::addDirectories , которого нет в composer, вам также понадобится ремесленник.
Показать ещё 6 комментариев
49

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

Чтобы получить структуру папок, например:

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

namespace 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
  • 0
    Работал на меня, по состоянию на 23.01.15. Это может измениться позже, так как L5 еще не вышел.
  • 0
    Спасибо за этот маленький кусочек. В LV4 вы могли пропустить 'use App \ Http \ Controllers \ Controller;' заявление, потому что вы расширили BaseController, который наследует непосредственно от контроллера. Это не относится к LV5, поскольку он расширяет контроллер напрямую, а автозагрузка PSR-4 должна знать, где найти контроллер.
Показать ещё 4 комментария
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.write sth в приложении/контроллерах/admin/IndexController.php, например:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4.доступьте свой сайт, например: localhost/admin/test вы увидите "admin.home" на странице

ps: Пожалуйста, проигнорируйте мой плохой английский

  • 1
    Использование пространства имен позволяет избежать конфликта имен. +1
7

Для ** 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']);

    });

Для перемещения деталей для создания подпапки перейдите по этой ссылке.

  • 0
    Этот работал для меня. Спасибо!
  • 1
    Для Laravel 5.4 это единственное решение, которое я нашел до сих пор.
Показать ещё 1 комментарий
6
php artisan make:controller admin/CategoryController

Здесь admin - это подкаталог в приложении /Http/Controllers и CategoryController - это контроллер, который вы хотите создать внутри каталога

  • 2
    Это должен быть принят ответ для Laravel 5.x
5

Я использую Laravel 4.2. Вот как я это делаю:
У меня есть структура каталогов, подобная этой:
приложение
--controllers
---- admin
------ AdminController.php

После того, как я создал контроллер, я поместил в composer.json путь к новому каталогу admin:

"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

Затем в route.php у меня есть контроллер, включенный вот так:

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

И все работает нормально.

  • 0
    У меня работает и мне нужно только запустить 'composer dump-autoload -o'
  • 0
    Просто для любого случая я использую также php artisan dump-autoload.
5

Просто нашел способ, как это сделать:

Просто добавьте пути к /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 уже находится в базе Laravel composer.json, все, что находится ниже, автоматически загружается. Вам не нужно добавлять / controllers / product в ваш global.php.
  • 1
    @AntonioCarlosRibeiro У меня была проблема с попыткой поместить модели в папки, но дамп автозагрузки композитора и ремесленника, похоже, не работает. Вы должны поместить их в composer.json или в global.php
Показать ещё 1 комментарий
4

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

php artisan make:controller User/User

В маршрутах

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

делать это было бы хорошо, и теперь на localhost/dashboard находится страница, на которой находится страница.

Надеюсь, что это поможет.

3

В Laravel 5.6 предполагается, что имя вашей подпапки ' Api:

В вашем контроллере вам нужны эти две строки:

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

И в вашем файле маршрута api.php вам нужно:

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

Я думаю, что держать контроллеры для 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');
});

И для раздела Admin он будет выглядеть как

/* 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']);                                   
    });
});

Надеюсь, это поможет!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню