Laravel Controller-Unterordner-Routing


95

Ich bin neu bei Laravel. Um meine App organisiert zu halten, möchte ich meine Controller in Unterordnern des Controller-Ordners ablegen.

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

Ich habe versucht, zu einem Controller zu routen, aber Laravel findet ihn nicht.

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

Was mache ich falsch?

Antworten:


112

Für Laravel 5.3 oben:

php artisan make:controller test/TestController

Dadurch wird der testOrdner erstellt, wenn er nicht vorhanden ist, und dann im TestControllerInneren erstellt .

TestController wird so aussehen:

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

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

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

Sie können Ihre Route dann folgendermaßen registrieren:

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

Gibt es eine Möglichkeit, das Gleiche für Laravel 4.2
Sagar Arora

10
php artisan make:controller test\TestControllererstellt testTestController.php während php artisan make:controller 'test\TestController'funktioniert. (Beachten Sie die Zitate) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

72

Fügen Sie Ihre Controller in Ihren Ordnern hinzu:

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

Erstellen Sie Ihre Route ohne Angabe des Ordners:

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

Lauf

composer dump-autoload

Und versuche es erneut


Ich denke du brauchst artisan dump-autoloadauch oder ist composer dump-autoloadgenug?
Reikyoushin

1
Für / Controller nur Komponist. Aber wenn Sie etwas haben, das ClassLoader::addDirectoriesSie nicht als Komponist haben, brauchen Sie auch Handwerker.
Antonio Carlos Ribeiro

Ich habe mich plötzlich daran erinnert, dass ich auf so etwas gestoßen bin. Siehe meinen Kommentar zur Antwort des OP
reikyoushin

composer dump-autoloadarbeite auch für mich. Wenn Sie ein Windows-Betriebssystem verwenden, können Sie composer dump-autoloadstattdessen eine .bat-Datei verwenden, um CMD einzugeben. Dies ist, was ich benutze: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
Vinsa

7
Was ist, wenn wir zwei Controller mit demselben Namen in forlder1 und folder2 haben? Zum Beispiel: admin / PostsController.php und Frontend / PostsController.php
Zennin

50

Für Benutzer von Laravel 5 müssen Sie den Namespace für den Controller im Unterverzeichnis festlegen (Laravel 5 befindet sich noch in der Entwicklung und Änderungen werden täglich vorgenommen.)

So erhalten Sie eine Ordnerstruktur wie:

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

Namespace Admin \ PostsController.php Datei wie folgt:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Dann ist Ihre Route dafür:

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

Und schließlich sollten Sie weder Komponisten noch Handwerker entlassen

composer dump-autoload

oder

php artisan dump

Arbeitete für mich am 23.01.15. Dies kann sich später ändern, da L5 noch nicht verfügbar ist.
sehummel

Danke für diesen kleinen Leckerbissen. In LV4 konnten Sie die Option "App \ Http \ Controller \ Controller verwenden" überspringen. Anweisung, weil Sie den BaseController erweitert haben, der direkt von Controller erbt. Dies ist in LV5 nicht der Fall, da es den Controller direkt erweitert und das automatische Laden des PSR-4 wissen muss, wo sich der Controller befindet.
Lionel Morrison

4
@user? php Namespace App \ Http \ Controller \ Admin; sollte Controller [s] mit s am Ende sein
Sven van den Boogaart

Dies funktionierte für mich mit der Einschränkung, dass ich der Composer-Anweisung "-o" hinzufügen musste, z. B.: Composer Dump-Autoload -o
Scott Byers

Dies hat bei mir nicht funktioniert. Die Fehlermeldung lautet jetzt App\Http\Controllers\Auth\Controllernicht gefunden. Warum wird das Wort Controllerdort angehängt und der tatsächliche Name des Controllers verloren? Ich denke, es ist der Schrägstrich, der das macht. -ohat nicht geholfen.
Blamb

15

Für ** Laravel 5 oder Laravel 5.1 LTS beide ** ist Route::groupes sehr hilfreich , wenn Sie mehrere Controller im Admin-Ordner haben . Beispielsweise:

Update : Funktioniert mit Laravel 5.4

Meine Ordnerstruktur:

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 {  
...

In My Route.php setze ich namespacegroup auf Api\V1und insgesamt sieht es so aus:

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

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

    });

Informationen zum Verschieben von Unterordnern finden Sie unter diesem Link .


1
Für Laravel 5.4 ist es die einzige Lösung, die ich bisher gefunden habe.
Mosh442

Perfekte Lösung
Ali Adil

In der Tat perfekt!
Rytis Dereskevicius

Game Changer ;-)
Strabek

9

1.Erstellen Sie Ihren Unterordner wie folgt:

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

2.Konfigurieren Sie Ihren Code in app / route.php

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

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

3.Schreibe etw in app / controller / admin / IndexController.php, zB:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. Greifen Sie auf Ihre Site zu, z. B.: localhost / admin / test. Auf der Seite wird "admin.home" angezeigt

ps: Bitte ignoriere mein schlechtes Englisch


2
Durch die Verwendung des Namespace wird eine Namenskollision vermieden. +1
FDisk

6

Ich habe gerade einen Weg gefunden, wie es geht:

Fügen Sie einfach die Pfade zur Datei /app/start/global.php hinzu

ClassLoader::addDirectories(array(

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

));

5
Falsch. Da sich / controller bereits in Laravels composer.json-Basis befindet, wird alles darunter automatisch automatisch geladen. Sie müssen / controller / product nicht zu Ihrer global.php hinzufügen.
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro Ich hatte dieses Problem beim Versuch, Modelle in Ordnern abzulegen , aber das Ausgeben von Autoloads für Komponisten und Handwerker scheint nicht zu funktionieren. Sie müssen sie auf composer.json oder auf global.php
reikyoushin

2
Es ist leicht zu überprüfen: Öffnen Sie nach dem Ausführen von composer du die Datei vendor / composer / autoload_classmap.php, und Ihre Klasse muss dort aufgelistet sein.
Antonio Carlos Ribeiro

6
php artisan make:controller admin/CategoryController

Hier ist admin das Unterverzeichnis unter app / Http / Controllers und CategoryController ist der Controller, den Sie im Verzeichnis erstellen möchten


6

In Laravel 5.6 lautet der Name Ihres Unterordners wie folgt Api:

In Ihrem Controller benötigen Sie diese beiden Zeilen:

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

Und in Ihrer Routendatei api.phpbenötigen Sie:

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

5

Ich benutze Laravel 4.2. So mache ich das:
Ich habe eine Verzeichnisstruktur wie diese:
app
--controllers
---- admin
------ AdminController.php

Nachdem ich den Controller erstellt habe, habe ich in der Datei composer.json den Pfad zum neuen Administratorverzeichnis eingegeben:

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

Als nächstes bin ich gelaufen

composer dump-autoload

und dann

php artisan dump-autoload

Dann habe ich in der route.php den Controller wie folgt aufgenommen:

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

Und alles funktioniert gut.


Funktioniert für mich und ich muss nur 'Composer Dump-Autoload -o'
ausführen

Nur für jeden Fall verwende ich auch PHP Artisan Dump-Autoload.
Todor Todorov

5

1) So können Sie Ihre App organisieren:

Jede Routendatei ( web.php, api.php...) wird in einer map()Methode in einer Datei deklariert

\app\Providers\RouteServiceProvider.php

Wenn Sie eine Routendatei zuordnen, die Sie ->namespace($this->namespace)für diese festlegen können, wird sie dort unter Beispielen angezeigt.

Dies bedeutet, dass Sie mehr Dateien erstellen können, um Ihr Projekt strukturierter zu gestalten!

Und legen Sie für jeden unterschiedliche Namespaces fest.

Aber ich bevorzuge Set empty stringfür den Namespace""

2) Sie können Ihre Controller so einstellen, dass sie auf native PHP-Weise routen. Siehe Beispiel:

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

Jetzt können Sie in Ihrer IDE auf Ihre Controller-Namen doppelklicken, um schnell und bequem dorthin zu gelangen.


Beste Antwort! Völlig konsistent mit Laravel und auf dem aufgebaut, was das Framework bereits standardmäßig bietet.
Jfoliveira

4

Wenn Sie Laravel 5.3 oder höher verwenden, müssen Sie nicht so komplex sein, wie andere Antworten bereits sagten. Verwenden Sie einfach den Standardbefehl handwerker, um einen neuen Controller zu generieren. Zum Beispiel, wenn ich einen UserController im UserOrdner erstellen möchte . Ich würde tippen

php artisan make:controller User/User

In Routen,

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

Genau dies zu tun wäre in Ordnung und jetzt befindet sich auf localhost / dashboard die Seite.

Hoffe das hilft.


3

Ich denke, um Controller für Admin und Front in separaten Ordnern zu halten, wird der Namespace gut funktionieren.

Bitte schauen Sie sich die unten stehende Laravel-Verzeichnisstruktur an, die für mich gut funktioniert.

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

Die Routen in der Datei "route / web.php" lauten wie folgt

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

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

Und für den Admin-Bereich wird es so aussehen

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

Hoffe das hilft!!


1

Ich hatte dieses Problem kürzlich mit Laravel 5.8, aber ich verstehe, dass ich den Controller wie folgt richtig definieren sollte:

php artisan make:controller SubFolder\MyController  // true

So nicht:

php artisan make:controller SubFolder/MyController  // false

Dann können Sie in routen / web.php wie folgt auf den Controller zugreifen:

Route::get('/my', 'SubFolder\MyController@index');
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.