web-dev-qa-db-ja.com

Laravel Controller Subfolder routing

私はLaravelが初めてです。アプリを整理しておくために、コントローラーをコントローラーフォルダーのサブフォルダーに入れたいと思います。

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

コントローラーにルーティングしようとしましたが、laravelが見つかりません。

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

私は何を間違えていますか?

75
Tino

上記の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');
79
Ja22

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

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

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

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

走る

composer dump-autoload

そしてさらに試みる

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または職人ダンプのいずれかを取得しないでください。

composer dump-autoload

または

php artisan dump
48
user2014679

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」が表示されます

pS:私の貧しい英語を無視してください

9
Mervyn

** Laravel 5またはLaravel 5.1 LTS両方**の場合、Adminフォルダーに複数のコントローラーがある場合、Route::groupが本当に役立ちます。例えば:

Update: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']);

    });

サブフォルダを作成するための移動の詳細については、こちらをご覧ください リンク

8
Ariful Haque
php artisan make:controller admin/CategoryController

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

6
Dipen

方法を見つけました:

/app/start/global.phpにパスを追加するだけです

ClassLoader::addDirectories(array(

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

));
6
Tino

Laravel 4.2を使用しています。ここで私がそれを行う方法:
私はこのようなディレクトリ構造を持っています:
アプリ
-コントローラー
---- 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');

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

5
Todor Todorov

Laravel 5.6では、サブフォルダーの名前がApiであると仮定します。

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

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

そして、ルートファイルapi.phpには、次のものが必要です。

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

Laravel 5.3以降を使用している場合、他の回答で述べられているように複雑さを感じる必要はありません。デフォルトのartisanコマンドを使用して、新しいコントローラーを生成するだけです。たとえば、UserフォルダーにUserコントローラーを作成する場合。入力します

php artisan make:controller User/User

ルートでは、

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

これを実行するだけで問題はなくなり、localhost/dashboardでページが存在するようになりました。

お役に立てれば。

4
Koushik Das

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

お役に立てれば!!

2
Mahesh Yadav

最近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');
0
foad salavati

それはあなたのアプリを整理する方法です:

すべてのルートファイル(web.phpapi.php ...)は、ファイル内のmap()メソッドで宣言されます

\app\Providers\RouteServiceProvider.php

ルートファイルをマッピングするとき、->namespace($this->namespace)を設定できます。例の中にあります。

より多くのファイルを作成して、プロジェクトをより構造化できることを意味します!

そして、それぞれに異なる名前空間を設定します。

しかし、empty string名前空間に""を設定することを好みます

コントローラをネイティブphpの方法でルーティングするように設定できます。例を参照してください。

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

IDEのコントローラー名をダブルクリックして、すばやく便利にアクセスできるようになりました。

0