Enrutamiento de subcarpetas del controlador Laravel

95

Soy nuevo en Laravel. Para intentar mantener mi aplicación organizada, me gustaría poner mis controladores en subcarpetas de la carpeta del controlador.

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

Traté de enrutarme a un controlador, pero laravel no lo encuentra.

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

¿Qué estoy haciendo mal?

Tino
fuente

Respuestas:

112

Para Laravel 5.3 anterior:

php artisan make:controller test/TestController

Esto creará la testcarpeta si no existe, luego crea TestControllerdentro.

TestController se verá así:

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

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

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

A continuación, puede registrar su ruta de esta manera:

Route::get('/test','test\TestController@getTest');
Ja22
fuente
¿Hay alguna forma de lograr lo mismo anterior para laravel 4.2
Sagar Arora
10
php artisan make:controller test\TestControllercrea testTestController.php mientras que php artisan make:controller 'test\TestController'funciona. (Tenga en cuenta las citas) - Laravel 5.4
Giovanni S
2
php artisan make:controller test/TestController
Amrit Shrestha
72

Agregue sus controladores en sus carpetas:

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

Crea tu ruta sin especificar la carpeta:

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

correr

composer dump-autoload

E intenta de nuevo

Antonio Carlos Ribeiro
fuente
creo que tu artisan dump-autoloadtambien necesitas o es composer dump-autoloadsuficiente?
reikyoushin
1
Para / controllers, solo composer. Pero si tienes algo ClassLoader::addDirectoriesque no tienes sobre compositor, también necesitarás artesano.
Antonio Carlos Ribeiro
De repente recordé que me encontré con algo como esto ... vea mi comentario sobre la respuesta del OP
reikyoushin
composer dump-autoloadtrabaja para mí también. Si usa el sistema operativo Windows, puede usar un archivo .bat para ejecutar en composer dump-autoloadlugar de escribir CMD cada vez. Esto es lo que estoy usando: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa
7
¿Qué pasa si tenemos dos controladores con el mismo nombre en forlder1 y folder2? Por ejemplo: admin / PostsController.php y frontend / PostsController.php
zennin
50

Para aquellos que usan Laravel 5, deben configurar el espacio de nombres para el controlador dentro del subdirectorio (Laravel 5 aún está en desarrollo y los cambios se realizan a diario)

Para obtener una estructura de carpetas como:

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

espacio de nombres Admin \ PostsController.php archivo así:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Entonces tu ruta para esto es:

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

Y por último, no te pongas a hacer volcado de compositor o artesano

composer dump-autoload

o

php artisan dump
usuario2014679
fuente
Me funcionó, a partir del 23/01/15. Esto puede cambiar más adelante ya que L5 aún no está disponible.
sehummel
Gracias por este pequeño detalle. En LV4, pudo omitir 'use App \ Http \ Controllers \ Controller;' declaración porque extendió el BaseController que hereda directamente de Controller. No es el caso en LV5, ya que extiende el controlador directamente y la carga automática del PSR-4 necesita saber dónde encontrar el controlador.
Lionel Morrison
4
@user? php espacio de nombres App \ Http \ Controller \ Admin; debe ser Controller [s] con s al final
Sven van den Boogaart
Esto funcionó para mí, con la advertencia de que tenía que agregar "-o" a la declaración del compositor, por ejemplo: composer dump-autoload -o
Scott Byers
Esto no funcionó para mí, el mensaje de error ahora dice App\Http\Controllers\Auth\Controllerno encontrado, ¿por qué se agrega la palabra Controllerallí y se pierde el nombre real del controlador? Creo que es la barra la que está haciendo eso. -ono ayudó.
culpar
15

Para ** Laravel 5 o Laravel 5.1 LTS ambos **, si tiene varios controladores en la carpeta de administración, Route::group será realmente útil para usted. Por ejemplo:

Actualización : funciona con Laravel 5.4

Mi estructura de carpetas:

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

En My Route.php, configuro el namespacegrupo Api\V1y, en general, se ve así:

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

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

    });

Para obtener detalles de movimiento para crear subcarpetas, visite este enlace .

Ariful Haque
fuente
1
Para Laravel 5.4, es la única solución que encontré hasta ahora.
mosh442
Solución perfecta
Ali Adil
¡Perfecto en verdad!
Rytis Dereskevicius
Cambiador de
9

1.Cree su subcarpeta como sigue:

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

2.configure su código en 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.escribe algo en la aplicación / controllers / admin / IndexController.php, por ejemplo:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. acceda a su sitio, por ejemplo: localhost / admin / test verá "admin.home" en la página

ps: por favor ignore mi pobre inglés

Mervyn
fuente
2
El uso del espacio de nombres evita la colisión de nombres. +1
FDisk
6

Acabo de encontrar una manera de hacerlo:

Simplemente agregue las rutas 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',

));
Tino
fuente
5
Incorrecto. Dado que / controllers ya está en la base composer.json de Laravel, todo lo que esté debajo se carga automáticamente. No necesitas agregar / controllers / product en tu global.php.
Antonio Carlos Ribeiro
1
@AntonioCarlosRibeiro He tenido este problema al intentar poner modelos en carpetas, pero la descarga automática del compositor y del artesano no parece funcionar. tienes que ponerlos en composer.json o en global.php
reikyoushin
2
Es fácil de verificar: después de ejecutar composer du, abra vendor / composer / autoload_classmap.php y su clase debe aparecer allí.
Antonio Carlos Ribeiro
6
php artisan make:controller admin/CategoryController

Aquí admin es el subdirectorio en app / Http / Controllers y CategoryController es el controlador que desea crear dentro del directorio

Dipen
fuente
6

En Laravel 5.6, asumiendo que el nombre de su subcarpeta 'es Api:

En su controlador, necesita estas dos líneas:

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

Y en su archivo de ruta api.php, necesita:

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

Estoy usando Laravel 4.2. Así es como lo hago:
tengo una estructura de directorio como esta:
app
--controllers
---- admin
------ AdminController.php

Después de haber creado el controlador, puse en composer.json la ruta al nuevo directorio de administración:

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

Siguiente he corrido

composer dump-autoload

y entonces

php artisan dump-autoload

Luego, en routes.php tengo el controlador incluido así:

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

Y todo funciona bien.

Todor Todorov
fuente
Funciona para mí y solo necesito ejecutar 'composer dump-autoload -o'
phuang07
En cualquier caso, también estoy usando php artisan dump-autoload.
Todor Todorov
5

1) Así es como puedes organizar tu aplicación:

Cada archivo de ruta ( web.php, api.php...) se declara en un map()método, en un archivo

\app\Providers\RouteServiceProvider.php

Cuando mapee un archivo de ruta, puede configurar un archivo ->namespace($this->namespace)para él, lo verá allí entre ejemplos.

¡Significa que puede crear más archivos para estructurar su proyecto!

Y establezca diferentes espacios de nombres para cada uno de ellos.

Pero prefiero establecer empty stringpara el espacio de nombres""

2) Puede configurar sus controladores para que se enruten de una manera php nativa, vea el ejemplo:

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

Ahora puede hacer doble clic en los nombres de sus controladores en su IDE para llegar rápida y cómodamente.

Yevgeniy Afanasyev
fuente
¡La mejor respuesta! Totalmente consistente con Laravel y construido sobre lo que el marco ya proporciona de fábrica.
jfoliveira
4

Si está utilizando Laravel 5.3 o superior, no hay necesidad de entrar en tanta complejidad como han dicho otras respuestas. Simplemente use el comando artesanal predeterminado para generar un nuevo controlador. Por ejemplo, si quiero crear un Usercontrolador en la Usercarpeta. Yo escribiría

php artisan make:controller User/User

En rutas,

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

hacer solo esto estaría bien y ahora en localhost / dashboard es donde reside la página.

Espero que esto ayude.

Koushik Das
fuente
3

Creo que para mantener los controladores para Admin y Front en carpetas separadas, el espacio de nombres funcionará bien.

Por favor, mire la estructura de directorios de Laravel a continuación, que funciona bien para mí.

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

Las rutas en el archivo "routes / web.php" serían las siguientes

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

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

Y para la sección de administración, se verá como

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

¡¡Espero que esto ayude!!

Mahesh Yadav
fuente
1

Tuve este problema recientemente con laravel 5.8 pero entiendo que debería definir el controlador de la manera correcta como esta a continuación:

php artisan make:controller SubFolder\MyController  // true

Así no:

php artisan make:controller SubFolder/MyController  // false

Luego puede acceder al controlador en route / web.php así:

Route::get('/my', 'SubFolder\MyController@index');
Foad
fuente