Roteamento de subpasta do controlador Laravel

95

Eu sou novo no Laravel. Para tentar manter meu aplicativo organizado, gostaria de colocar meus controladores em subpastas da pasta do controlador.

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

Tentei rotear para um controlador, mas laravel não o encontrou.

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

O que estou fazendo de errado?

Tino
fonte

Respostas:

112

Para o Laravel 5.3 acima:

php artisan make:controller test/TestController

Isso criará a testpasta, se ela não existir, e criará TestControllerdentro dela .

TestController será parecido com isto:

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

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

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

Você pode então registrar sua rota desta forma:

Route::get('/test','test\TestController@getTest');
Ja22
fonte
existe alguma maneira de conseguir o mesmo acima para laravel 4.2
Sagar Arora
10
php artisan make:controller test\TestControllercria testTestController.php enquanto php artisan make:controller 'test\TestController'funciona. (Observe as citações) - Laravel 5.4
Giovanni S
2
php artisan make:controller test/TestController
Amrit Shrestha
72

Adicione seus controladores em suas pastas:

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

Crie sua rota sem especificar a pasta:

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

Corre

composer dump-autoload

E tente novamente

Antonio Carlos Ribeiro
fonte
eu acho que você artisan dump-autoloadtambém precisa ou é o composer dump-autoloadsuficiente?
reikyoushin
1
Para / controllers, apenas composer. Mas se você tem algo ClassLoader::addDirectoriesque não tem no compositor, você também vai precisar de um artesão.
Antonio Carlos Ribeiro
De repente, lembrei que encontrei algo assim .. veja meu comentário sobre a resposta do OP
reikyoushin
composer dump-autoloadtrabalhar para mim também. Se você usa o sistema operacional Windows, pode usar um arquivo .bat para executar, em composer dump-autoloadvez de digitar CMD todas as vezes. Isto é o que estou usando: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa
7
E se tivermos dois controladores com o mesmo nome em forlder1 e folder2? Por exemplo: admin / PostsController.php e frontend / PostsController.php
zennin
50

Para aqueles que usam Laravel 5, você precisa definir o namespace para o controlador dentro do subdiretório (o Laravel 5 ainda está em desenvolvimento e mudanças acontecem diariamente)

Para obter uma estrutura de pastas como:

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

arquivo Admin \ PostsController.php do namespace da seguinte forma:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Então, sua rota para isso é:

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

E por último, não para começar a fazer o dump de compositor ou artesão

composer dump-autoload

ou

php artisan dump
user2014679
fonte
Trabalhou para mim a partir de 23/01/15. Isso pode mudar mais tarde, pois o L5 ainda não foi lançado.
sehummel
Obrigado por este pequeno petisco. No LV4, você foi capaz de pular o 'use App \ Http \ Controllers \ Controller;' porque você estendeu o BaseController que herda diretamente do Controller. Não é o caso do LV5, pois estende o controlador diretamente e o autoload do PSR-4 precisa saber onde encontrar o controlador.
Lionel Morrison,
4
@user? php namespace App \ Http \ Controller \ Admin; deve ser Controlador [s] com s no final
Sven van den Boogaart
Isso funcionou para mim, com a ressalva de que eu tinha que adicionar "-o" à instrução do compositor, por exemplo: composer dump-autoload -o
Scott Byers
Isso não funcionou para mim, a mensagem de erro agora diz App\Http\Controllers\Auth\Controllernão encontrado, por que é anexar a palavra Controllerlá e perder o nome real do controlador? Eu acho que é a barra que está fazendo isso. -onão ajudou.
blamb de
15

Para ** Laravel 5 ou Laravel 5.1 LTS **, se você tiver vários controladores na pasta Admin, Route::groupserá realmente útil para você. Por exemplo:

Atualização : Funciona com Laravel 5.4

Estrutura da minha pasta:

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

Em My Route.php, eu defino o namespacegrupo para Api\V1e, no geral, parece:

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

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

    });

Para obter detalhes sobre a movimentação para criar uma subpasta, visite este link .

Ariful Haque
fonte
1
Para o Laravel 5.4, é a única solução que encontrei até agora.
mosh442
Solução perfeita
Ali Adil
Perfeito!
Rytis Dereskevicius
Mudança de
9

1.crie sua subpasta exatamente como segue:

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

2. configure seu código em 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. escrever sth em app / controllers / admin / IndexController.php, por exemplo:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. acesse seu site, por exemplo: localhost / admin / test, você verá "admin.home" na página

ps: Por favor, ignore meu pobre inglês

Mervyn
fonte
2
O uso de namespace evita colisão de nomes. +1
FDisk
6

Acabei de encontrar uma maneira de fazer isso:

Basta adicionar os caminhos ao /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
fonte
5
Errado. Uma vez que / controllers já está na base composer.json do Laravel, qualquer coisa abaixo dele é carregada automaticamente. Você não precisa adicionar / controllers / product em seu global.php.
Antonio Carlos Ribeiro
1
@AntonioCarlosRibeiro Eu tive esse problema ao tentar colocar modelos em pastas, mas esvaziar os carregamentos automáticos do compositor e do artesão não parece funcionar. você tem que colocá-los em composer.json ou em global.php
reikyoushin
2
É fácil verificar: depois de executar composer du, abra vendor / composer / autoload_classmap.php e sua classe deve estar listada lá.
Antonio Carlos Ribeiro
6
php artisan make:controller admin/CategoryController

Aqui, admin é o subdiretório sob app / Http / Controllers e CategoryController é o controlador que você deseja criar dentro do diretório

Dipen
fonte
6

No Laravel 5.6, assumindo o nome de sua subpasta 'é Api:

Em seu controlador, você precisa destas duas linhas:

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

E em seu arquivo de rota api.php, você precisa:

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

Estou usando o Laravel 4.2. Aqui está como faço isso:
Eu tenho uma estrutura de diretório como esta:
app
--controllers
---- admin
------ AdminController.php

Depois de criar o controlador, coloquei no composer.json o caminho para o novo diretório de administração:

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

Em seguida eu corri

composer dump-autoload

e depois

php artisan dump-autoload

Então, no routes.php eu incluo o controlador assim:

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

E tudo funciona bem.

Todor Todorov
fonte
Funciona para mim e eu só preciso executar 'composer dump-autoload -o'
phuang07
Em qualquer caso, estou usando também o php artisan dump-autoload.
Todor Todorov
5

1) É assim que você pode tornar seu aplicativo organizado:

Cada arquivo de rota ( web.php, api.php...) é declarado em um map()método, em um arquivo

\app\Providers\RouteServiceProvider.php

Ao mapear um arquivo de rota, você pode definir um ->namespace($this->namespace)para ele, você o verá ali entre os exemplos.

Significa que você pode criar mais arquivos para deixar seu projeto mais estruturado!

E defina namespaces diferentes para cada um deles.

Mas eu prefiro definir empty stringpara o namespace""

2) Você pode definir seus controladores para rotear em uma forma nativa de php, veja o exemplo:

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

Agora você pode clicar duas vezes nos nomes dos controladores em seu IDE para chegar lá de forma rápida e conveniente.

Yevgeniy Afanasyev
fonte
Melhor resposta! Totalmente consistente com o Laravel e construído em cima do que o framework já fornece fora da caixa.
jfoliveira
4

Se você estiver usando o Laravel 5.3 ou superior, não há necessidade de entrar em tanta complexidade como outras respostas disseram. Basta usar o comando artesão padrão para gerar um novo controlador. Por exemplo, se eu quiser criar um Usercontrolador na Userpasta. Eu iria digitar

php artisan make:controller User/User

Nas rotas,

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

fazer apenas isso seria bom e agora em localhost / painel é onde a página reside.

Espero que isto ajude.

Koushik Das
fonte
3

Acho que para manter os controladores para Admin e Front em pastas separadas, o namespace funcionará bem.

Por favor, olhe a estrutura de diretório do Laravel abaixo, que funciona bem para mim.

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

As rotas no arquivo "routes / web.php" seriam as seguintes

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

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

E para a seção de administração, será semelhante a

/* 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 isto ajude!!

Mahesh Yadav
fonte
1

Tive esse problema recentemente com o laravel 5.8, mas entendo e devo definir o controlador da maneira correta como segue:

php artisan make:controller SubFolder\MyController  // true

Assim não:

php artisan make:controller SubFolder/MyController  // false

Então você pode acessar o controlador em routes / web.php assim:

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