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\TestControllerphp artisan make:controller 'test\TestController'작동 하는 동안 testTestController.php를 만듭니다 . (따옴표 참고)-Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

73

폴더에 컨트롤러를 추가합니다.

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

폴더를 지정하지 않고 경로를 만듭니다.

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

운영

composer dump-autoload

그리고 다시 시도하십시오


당신도 필요하다고 생각 합니까 artisan dump-autoload아니면 composer dump-autoload충분합니까?
reikyoushin

1
/ controllers의 경우 composer입니다. 그러나 ClassLoader::addDirectories작곡가에없는 것이 있다면 장인도 필요합니다.
Antonio Carlos Ribeiro

나는 갑자기 이런 식으로 뭔가를 만난 기억했습니다 .. 영업의 대답에 내 의견을 참조
reikyoushin

composer dump-autoload나도 일해. Windows OS를 사용하는 경우 .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

나를 위해 일했습니다. L5가 아직 출시되지 않았으므로 나중에 변경 될 수 있습니다.
sehummel

이 작은 정보에 감사드립니다. LV4에서는 'use App \ Http \ Controllers \ Controller;'를 건너 뛸 수있었습니다. Controller에서 직접 상속하는 BaseController를 확장했기 때문입니다. LV5에서는 컨트롤러를 직접 확장하고 PSR-4 자동 로딩은 컨트롤러를 찾을 위치를 알아야합니다.
Lionel Morrison

4
@user? php 네임 스페이스 App \ Http \ Controller \ Admin; 마지막 컨트롤러 [S]와 S이어야
스벤 반 덴 Boogaart

이것은 작곡가 문장에 "-o"를 추가해야한다는 경고와 함께 저에게 효과적이었습니다. 예 : composer dump-autoload -o
Scott Byers

이것은 나를 위해 작동하지 않았고 오류 메시지는 이제 App\Http\Controllers\Auth\Controller찾을 수 없음을 나타냅니다. 왜 Controller거기에 단어가 추가 되고 컨트롤러의 실제 이름이 손실됩니까? 나는 그것을하는 슬래시라고 생각합니다. -o도움이되지 않았습니다.
blamb

15

** Laravel 5 또는 Laravel 5.1 LTS의 경우 **, Admin 폴더에 여러 컨트롤러 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 {  
...

내 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

완벽한 솔루션
Ali Adil

참으로 완벽합니다!
Rytis Dereskevicius

게임 체인저 ;-)
Strabek

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. app / controllers / admin / IndexController.php에 sth를 작성합니다. 예 :

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. 사이트에 액세스합니다. 예 : localhost / admin / test 페이지에 "admin.home"이 표시됩니다.

추신 : 내 가난한 영어를 무시하십시오


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는 이미 Laravel의 composer.json 기반에 있으므로 그 아래의 모든 항목은 자동으로 자동로드됩니다. global.php에 / controllers / product를 추가 할 필요가 없습니다.
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro 모델을 폴더에 넣으려고 할 때이 문제 가 있었지만 작곡가와 장인 자동로드가 작동하지 않는 것 같습니다. composer.json 또는 global.php에 넣어야합니다
reikyoushin 2013-09-17

2
확인하기 쉽습니다. composer du를 실행 한 후 vendor / composer / autoload_classmap.php를 열고 클래스가 거기에 나열되어야합니다.
Antonio Carlos Ribeiro

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

그런 다음 routes.php에 다음과 같은 컨트롤러가 포함되어 있습니다.

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

그리고 모든 것이 잘 작동합니다.


나를 위해
일하고

어쨌든 나는 php artisan dump-autoload도 사용하고 있습니다.
Todor Todorov

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

그런 다음 다음과 같이 routes / web.php에서 컨트롤러에 액세스 할 수 있습니다.

Route::get('/my', 'SubFolder\MyController@index');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.