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?

Tino
quelle

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

Antonio Carlos Ribeiro
quelle
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
user2014679
quelle
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 .

Ariful Haque
quelle
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

Mervyn
quelle
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',

));
Tino
quelle
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

Dipen
quelle
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');
DevonDahon
quelle
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.

Todor Todorov
quelle
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.

Jewgenij Afanasjew
quelle
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.

Koushik Das
quelle
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!!

Mahesh Yadav
quelle
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');
Foad
quelle