Routing do podfolderów kontrolera Laravel

95

Jestem nowy w Laravel. Aby zachować porządek w mojej aplikacji, chciałbym umieścić moje kontrolery w podfolderach folderu kontrolera.

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

Próbowałem skierować się do kontrolera, ale laravel go nie znajduje.

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

Co ja robię źle?

Tino
źródło

Odpowiedzi:

115

Dla Laravel 5.3 powyżej:

php artisan make:controller test/TestController

Spowoduje to utworzenie testfolderu, jeśli nie istnieje, a następnie zostanie utworzony w TestControllerśrodku.

TestController będzie wyglądać tak:

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

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

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

Następnie możesz zarejestrować swoją trasę w ten sposób:

Route::get('/test','test\TestController@getTest');
Ja22
źródło
czy jest jakiś sposób na osiągnięcie tego samego dla laravel 4.2
Sagar Arora
11
php artisan make:controller test\TestControllertworzy testTestController.php, podczas gdy php artisan make:controller 'test\TestController'działa. (Zwróć uwagę na cytaty) - Laravel 5.4
Giovanni S
2
php artisan make:controller test/TestController
Amrit Shrestha
73

Dodaj kontrolery do swoich folderów:

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

Utwórz trasę, nie określając folderu:

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

Biegać

composer dump-autoload

I spróbuj ponownie

Antonio Carlos Ribeiro
źródło
myślę, że ty artisan dump-autoloadteż potrzebujesz, czy composer dump-autoloadwystarczy?
reikyoushin
1
Dla / controllers, po prostu composer. Ale jeśli masz w sobie coś ClassLoader::addDirectories, czego nie masz na temat kompozytora, będziesz też potrzebować rzemieślnika.
Antonio Carlos Ribeiro
Nagle przypomniałem sobie, że spotkałem coś takiego ... zobacz mój komentarz do odpowiedzi OP
reikyoushin
composer dump-autoloadpracuj też dla mnie. Jeśli używasz systemu operacyjnego Windows, możesz użyć pliku .bat do uruchomienia composer dump-autoloadzamiast wpisywania CMD za każdym razem. Oto czego używam: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa
7
A co, jeśli mamy dwa kontrolery o tej samej nazwie w forlder1 i folder2? Na przykład: admin / PostsController.php and frontend / PostsController.php
zennin Kwietnia
50

Dla tych, którzy używają Laravel 5, musisz ustawić przestrzeń nazw dla kontrolera w podkatalogu (Laravel 5 jest wciąż w fazie rozwoju i zmiany zachodzą codziennie)

Aby uzyskać strukturę folderów, taką jak:

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

namespace Admin \ PostsController.php tak:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Twoja trasa to:

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

I na koniec, nie rób tego ani kompozytora, ani rzemieślnika

composer dump-autoload

lub

php artisan dump
user2014679
źródło
Pracował dla mnie od 23.01.15. Może się to zmienić później, ponieważ L5 jeszcze się nie skończył.
sehummel
Dzięki za tę małą ciekawostkę. W LV4 mogłeś pominąć 'use App \ Http \ Controllers \ Controller;' ponieważ rozszerzyłeś BaseController, który dziedziczy bezpośrednio z kontrolera. Nie dotyczy to LV5, ponieważ rozszerza on bezpośrednio kontroler, a funkcja automatycznego ładowania PSR-4 musi wiedzieć, gdzie znaleźć kontroler.
Lionel Morrison
4
@user? php przestrzeń nazw App \ Http \ Controller \ Admin; Powinien być kontrolerem [s] z s na końcu
Sven van den Boogaart
To zadziałało dla mnie, z zastrzeżeniem, że musiałem dodać „-o” do oświadczenia kompozytora, np.: Composer dump-autoload -o
Scott Byers
To nie zadziałało dla mnie, komunikat o błędzie mówi teraz App\Http\Controllers\Auth\Controllernie znaleziono, dlaczego dołącza tam słowo Controlleri traci rzeczywistą nazwę kontrolera? Myślę, że to slash, który to robi. -onie pomogło.
blamb
15

Dla ** Laravel 5 lub Laravel 5.1 LTS, oba **, jeśli masz wiele kontrolerów w folderze Admin, Route::groupbędą dla Ciebie bardzo pomocne. Na przykład:

Aktualizacja : działa z Laravel 5.4

Struktura mojego folderu:

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

W My Route.php ustawiam namespacegrupę na Api\V1i ogólnie wygląda to tak:

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

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

    });

Aby uzyskać szczegółowe informacje dotyczące przenoszenia, aby utworzyć podfolder, odwiedź ten link .

Ariful Haque
źródło
1
W przypadku Laravel 5.4 jest to jedyne rozwiązanie, jakie do tej pory znalazłem.
mosh442
Idealne rozwiązanie
Ali Adil
Rzeczywiście idealne!
Rytis Dereskevicius
Zmieniacz gier ;-)
Strabek
9

1. utwórz swój podfolder w następujący sposób:

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

2. skonfiguruj swój kod w app / tours.php

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

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

3. napisz coś w app / controllers / admin / IndexController.php, np .:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. uzyskaj dostęp do swojej witryny, np. : Localhost / admin / test, zobaczysz na stronie „admin.home”

ps: Proszę zignorować mój słaby angielski

Mervyn
źródło
2
Korzystanie z przestrzeni nazw pozwala uniknąć kolizji nazw. +1
FDisk
6

Właśnie znalazłem sposób, jak to zrobić:

Po prostu dodaj ścieżki do /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
źródło
5
Źle. Ponieważ / controllers znajduje się już w bazie Composer.json Laravela, wszystko poniżej jest automatycznie ładowane. Nie musisz dodawać / controllers / product do swojego global.php.
Antonio Carlos Ribeiro
1
@AntonioCarlosRibeiro Miałem problem z próbą umieszczania modeli w folderach, ale zrzucanie autoloaderów kompozytora i rzemieślnika wydaje się nie działać. musisz umieścić je na composer.json lub global.php
reikyoushin
2
Łatwo to sprawdzić: po uruchomieniu programu composer du otwórz vendor / composer / autoload_classmap.php i twoja klasa musi być tam wymieniona.
Antonio Carlos Ribeiro
6
php artisan make:controller admin/CategoryController

Tutaj admin to podkatalog w app / Http / Controllers, a CategoryController to kontroler, który chcesz utworzyć w katalogu

Zanurzyć
źródło
6

W Laravel 5.6, zakładając, że nazwa twojego podfolderu to Api :

W kontrolerze potrzebujesz tych dwóch wierszy:

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

W pliku trasy api.phppotrzebujesz:

Route::resource('/myapi', 'Api\MyController');
DevonDahon
źródło
5

Używam Laravel 4.2. Oto jak to robię:
mam strukturę katalogów taką jak ta:
app
--controllers
---- admin
------ AdminController.php

Po utworzeniu kontrolera umieściłem w pliku composer.json ścieżkę do nowego katalogu administratora:

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

Następnie pobiegłem

composer dump-autoload

i wtedy

php artisan dump-autoload

Następnie w route.php mam kontroler zawarty w ten sposób:

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

I wszystko działa dobrze.

Todor Todorov
źródło
Działa dla mnie i muszę tylko uruchomić
``
W każdym razie używam również php artisan dump-autoload.
Todor Todorov
5

1) W ten sposób możesz zorganizować swoją aplikację:

Każdy plik trasy ( web.php, api.php...) jest zadeklarowany w map()metodzie w pliku

\app\Providers\RouteServiceProvider.php

Podczas mapowania pliku trasy możesz ustawić ->namespace($this->namespace)dla niego znak , zobaczysz go tam wśród przykładów.

Oznacza to, że możesz tworzyć więcej plików, aby projekt był bardziej uporządkowany!

I ustaw różne przestrzenie nazw dla każdego z nich.

Ale ja wolę ustawić empty stringdla przestrzeni nazw""

2) Możesz ustawić swoje kontrolery na routing w natywny sposób php, zobacz przykład:

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

Teraz możesz dwukrotnie kliknąć nazwy kontrolerów w swoim IDE, aby szybko i wygodnie się tam dostać.

Yevgeniy Afanasyev
źródło
Najlepsza odpowiedź! Całkowicie spójny z Laravelem i zbudowany na podstawie tego, co framework zapewnia już po wyjęciu z pudełka.
jfoliveira
4

Jeśli używasz Laravel 5.3 lub nowszego, nie ma potrzeby wchodzenia w tak dużą złożoność, jak powiedziały inne odpowiedzi. Po prostu użyj domyślnego polecenia artisan, aby wygenerować nowy kontroler. Na przykład, jeśli chcę utworzyć Userkontroler w Userfolderze. Pisałbym

php artisan make:controller User/User

Na trasach

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

wystarczyłoby to zrobić, a teraz na localhost / dashboard znajduje się strona.

Mam nadzieję że to pomoże.

Koushik Das
źródło
3

Myślę, że aby zachować kontrolery Admin i Front w osobnych folderach, przestrzeń nazw będzie działać dobrze.

Proszę spojrzeć na poniższą strukturę katalogów Laravel, która działa dobrze dla mnie.

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

Trasy w pliku „route / web.php” wyglądałyby jak poniżej

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

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

A dla sekcji Administracja będzie to wyglądać

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

Mam nadzieję że to pomoże!!

Mahesh Yadav
źródło
1

Niedawno miałem ten problem z laravelem 5.8, ale nie doceniam, że powinienem poprawnie zdefiniować kontroler, jak poniżej:

php artisan make:controller SubFolder\MyController  // true

Nie tak jak to:

php artisan make:controller SubFolder/MyController  // false

Następnie możesz uzyskać dostęp do kontrolera w route / web.php w następujący sposób:

Route::get('/my', 'SubFolder\MyController@index');
Foad
źródło