Routing della sottocartella del controller Laravel


95

Sono nuovo a Laravel. Per cercare di mantenere la mia app organizzata, vorrei mettere i miei controller in sottocartelle della cartella del controller.

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

Ho provato a instradare verso un controller, ma laravel non lo trova.

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

Che cosa sto facendo di sbagliato?

Risposte:


112

Per Laravel 5.3 sopra:

php artisan make:controller test/TestController

Questo creerà la testcartella se non esiste, quindi crea TestControllerall'interno.

TestController sarà simile a questo:

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

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

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

È quindi possibile registrare il percorso in questo modo:

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

c'è un modo per ottenere lo stesso risultato per laravel 4.2
Sagar Arora

10
php artisan make:controller test\TestControllercrea testTestController.php mentre php artisan make:controller 'test\TestController'funziona. (Nota le citazioni) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

72

Aggiungi i tuoi controller nelle tue cartelle:

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

Crea il tuo percorso senza specificare la cartella:

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

Correre

composer dump-autoload

E prova ancora


penso che tu abbia bisogno artisan dump-autoloadanche tu o è composer dump-autoloadabbastanza?
reikyoushin

1
Per i controller /, solo compositore. Ma se hai qualcosa ClassLoader::addDirectoriesche non hai sul compositore, avrai bisogno anche di artigiano.
Antonio Carlos Ribeiro

Improvvisamente mi sono ricordato di aver incontrato qualcosa di simile .. vedi il mio commento sulla risposta
dell'OP

composer dump-autoloadlavora anche per me. Se utilizzi il sistema operativo Windows, puoi utilizzare un file .bat da eseguire composer dump-autoloadinvece di digitare CMD ogni volta. Questo è quello che sto usando: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa

7
Cosa succede se abbiamo due controller con lo stesso nome in forlder1 e folder2? Ad esempio: admin / PostsController.php e frontend / PostsController.php
zennin

50

Per coloro che utilizzano Laravel 5 è necessario impostare lo spazio dei nomi per il controller all'interno della sottodirectory (Laravel 5 è ancora in fase di sviluppo e le modifiche avvengono quotidianamente)

Per ottenere una struttura di cartelle come:

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

File dello spazio dei nomi Admin \ PostsController.php in questo modo:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Quindi il tuo percorso per questo è:

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

E infine, non fare né il compositore né la discarica artigianale

composer dump-autoload

o

php artisan dump

Ha funzionato per me, dal 23/01/15. Questo potrebbe cambiare in seguito poiché L5 non è ancora uscito.
sehummel

Grazie per questo piccolo bocconcino. In LV4 eri in grado di saltare "usa App \ Http \ Controllers \ Controller;" perché hai esteso il BaseController che eredita direttamente dal controller. Non è il caso di LV5 in quanto estende direttamente il controller e l'autoloading della PSR-4 deve sapere dove trovare il controller.
Lionel Morrison

4
@user? php namespace App \ Http \ Controller \ Admin; dovrebbe essere Controller [i] con s alla fine
Sven van den Boogaart

Questo ha funzionato per me, con l'avvertenza che dovevo aggiungere "-o" alla dichiarazione del compositore, ad esempio: composer dump-autoload -o
Scott Byers

Questo non ha funzionato per me, il messaggio di errore ora dice App\Http\Controllers\Auth\Controllernon trovato, perché si aggiunge la parola Controllerlì e si perde il nome effettivo del controller? Penso che sia il taglio che sta facendo questo. -onon ha aiutato.
blamb

15

Per ** Laravel 5 o Laravel 5.1 LTS entrambi **, se hai più controller nella cartella Admin, Route::group saranno davvero utili per te. Per esempio:

Aggiornamento : funziona con Laravel 5.4

La mia struttura di cartelle:

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, ho impostato il namespacegruppo su Api\V1e nel complesso sembra:

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

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

    });

Per i dettagli sullo spostamento per creare una sottocartella, visitare questo collegamento .


1
Per Laravel 5.4 è l'unica soluzione che ho trovato finora.
mosh442

Soluzione perfetta
Ali Adil

Perfetto davvero!
Rytis Dereskevicius


9

1.crea la tua sottocartella proprio come segue:

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

2.configura il tuo codice in 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.scrivi qc in app / controllers / admin / IndexController.php, ad esempio:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. accedi al tuo sito, ad esempio localhost / admin / test vedrai "admin.home" nella pagina

ps: Per favore ignora il mio povero inglese


2
L'utilizzo dello spazio dei nomi evita la collisione dei nomi. +1
FDisk

6

Ho appena trovato un modo per farlo:

Basta aggiungere i percorsi a /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
Sbagliato. Poiché / controllers è già nella base composer.json di Laravel, tutto ciò che si trova sotto viene automaticamente caricato automaticamente. Non è necessario aggiungere / controllers / product sul tuo global.php.
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro Ho avuto questo problema cercando di inserire i modelli nelle cartelle, ma il dumping dei caricamenti automatici di Composer e Artisan non sembra funzionare. devi metterli su composer.json o su global.php
reikyoushin

2
È facile da controllare: dopo aver eseguito composer du, apri vendor / composer / autoload_classmap.php e la tua classe deve essere elencata lì.
Antonio Carlos Ribeiro

6
php artisan make:controller admin/CategoryController

Qui admin è la sottodirectory in app / Http / Controllers e CategoryController è il controller che desideri creare all'interno della directory


6

In Laravel 5.6, assumendo che il nome della tua sottocartella 'sia Api :

Nel tuo controller, hai bisogno di queste due righe:

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

E nel file del percorso api.php, hai bisogno di:

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

5

Sto usando Laravel 4.2. Ecco come lo faccio:
ho una struttura di directory come questa:
app
--controllers
---- admin
------ AdminController.php

Dopo aver creato il controller, ho inserito in composer.json il percorso della nuova directory admin:

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

Poi ho corso

composer dump-autoload

e poi

php artisan dump-autoload

Quindi in route.php ho il controller incluso in questo modo:

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

E tutto funziona bene.


Funziona per me e ho solo bisogno di eseguire 'composer dump-autoload -o'
phuang07

Ad ogni modo sto usando anche php artisan dump-autoload.
Todor Todorov

5

1) Ecco come puoi organizzare la tua app:

Ogni file di rotta ( web.php, api.php...) è dichiarato in un map()metodo, in un file

\app\Providers\RouteServiceProvider.php

Quando si mappa un file di rotta è possibile impostare un file ->namespace($this->namespace) , lo vedrai tra gli esempi.

Significa che puoi creare più file per rendere più strutturato il tuo progetto!

E imposta spazi dei nomi diversi per ciascuno di essi.

Ma preferisco il set empty string per lo spazio dei nomi""

2) Puoi impostare i tuoi controller per il routing in modo nativo in php, guarda l'esempio:

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

Ora puoi fare doppio clic sui nomi dei controller nel tuo IDE per accedervi rapidamente e comodamente.


Migliore risposta! Totalmente coerente con Laravel e costruito su ciò che il framework fornisce già fuori dagli schemi.
jfoliveira

4

Se stai usando Laravel 5.3 o versioni successive, non è necessario entrare in così tanta complessità come hanno detto altre risposte. Basta usare il comando artisan predefinito per generare un nuovo controller. Ad esempio, se voglio creare un Usercontroller nella Usercartella. Vorrei scrivere

php artisan make:controller User/User

Nelle rotte,

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

fare solo questo andrebbe bene e ora su localhost / dashboard è dove risiede la pagina.

Spero che questo ti aiuti.


3

Penso che per mantenere i controller per Admin e Front in cartelle separate, lo spazio dei nomi funzionerà bene.

Si prega di guardare la struttura della directory Laravel sottostante, che funziona bene per me.

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

Le rotte nel file "rotte / web.php" sarebbero le seguenti

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

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

E per la sezione Admin, apparirà come

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

Spero che questo ti aiuti!!


1

Ho avuto questo problema di recente con laravel 5.8 ma ho capito che dovrei definire il controller in modo corretto come questo di seguito:

php artisan make:controller SubFolder\MyController  // true

Non così:

php artisan make:controller SubFolder/MyController  // false

Quindi puoi accedere al controller in route / web.php in questo modo:

Route::get('/my', 'SubFolder\MyController@index');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.