Laravelコントローラーサブフォルダールーティング


95

Laravelは初めてです。アプリを整理しておくために、コントローラーをコントローラーフォルダーのサブフォルダーに配置します。

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

コントローラにルーティングしようとしましたが、laravelはそれを見つけません。

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

何が悪いのですか?

回答:


112

上記の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で同じことを達成する方法はありますか
Sagar Arora

10
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
アムリットシュレスタ2018

72

フォルダーにコントローラーを追加します。

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

フォルダーを指定せずにルートを作成します。

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

走る

composer dump-autoload

そしてさらに試みる


私はあなたが必要だと思うartisan dump-autoloadすぎやでcomposer dump-autoload十分?
reikyoushin 2013

1
/ controllersの場合は、作曲家だけです。しかし、ClassLoader::addDirectories作曲家にないものがある場合は、職人も必要になります。
アントニオカルロスリベイロ

こんなふうに遭遇したことを突然思い出しました。OPの回答に関する私のコメントを参照してください。
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に同じ名前の2つのコントローラーがある場合はどうなりますか?たとえば、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

2015年1月23日現在、私のために働いていました。L5がまだリリースされていないため、これは後で変更される可能性があります。
sehummel

この小さな一口をありがとう。LV4では、「use App \ Http \ Controllers \ Controller;」をスキップできました。これは、Controllerから直接継承するBaseControllerを拡張したためです。LV5の場合はそうではありません。コントローラーを直接拡張し、PSR-4オートローディングはコントローラーの場所を知る必要があるためです。
ライオネルモリソン

4
@user?php名前空間App \ Http \ Controller \ Admin; 末尾がsのコントローラである必要があります
Sven van den Boogaart

これは私にとってはうまくいきましたが、 "-o"をcomposerステートメントに追加しなければならないという警告がありました。例:composer dump-autoload -o
Scott Byers

これは私にとってはうまくいきませんでした、今エラーメッセージApp\Http\Controllers\Auth\Controllerは見つかりませんでしたと言います、なぜControllerそこに単語を追加し、コントローラの実際の名前を失うのですか?スラッシュがそうしていると思います。 -o助けにはならなかった。
2017年

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 2017年

完璧なソリューション
Ali Adil 2018

本当に完璧です!
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. 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 2015年

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を追加する必要はありません。
アントニオカルロスリベイロ

1
@AntonioCarlosRibeiro モデルをフォルダーに配置しようとしてこの問題が発生しましたがコンポーザーとアーティザンのオートロードのダンプが機能しないようです。それらをcomposer.jsonまたはglobal.phpに配置する必要があります
reikyoushin

2
簡単に確認できます。composerduを実行した後、vendor / composer / autoload_classmap.phpを開くと、クラスがそこにリストされている必要があります。
アントニオカルロスリベイロ

6
php artisan make:controller admin/CategoryController

ここでadminはapp / Http / Controllersの下のサブディレクトリで、CategoryControllerはディレクトリ内に作成するコントローラーです


6

Laravel 5.6では、サブフォルダーの名前が Api

コントローラーには、次の2行が必要です。

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');

そして、すべてが正常に動作します。


私にとっては機能し、「composer dump-autoload -o」を実行するだけです
phuang07

どんな場合でも、php artisan dump-autoloadも使用しています。
Todor Todorov 2014年

5

1)これで、アプリを整理できます。

すべてのルートファイル(web.phpapi.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コマンドを使用して、新しいコントローラーを生成するだけです。たとえばUserUserフォルダにコントローラを作成したい場合などです。入力します

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.