Perutean subfolder Pengontrol Laravel


96

Saya baru mengenal Laravel. Untuk mencoba dan menjaga aplikasi saya tetap teratur, saya ingin meletakkan pengontrol saya ke dalam subfolder dari folder pengontrol.

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

Saya mencoba merutekan ke pengontrol, tetapi laravel tidak menemukannya.

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

Apa yang saya lakukan salah?

Jawaban:


115

Untuk Laravel 5.3 di atas:

php artisan make:controller test/TestController

Ini akan membuat testfolder jika tidak ada, kemudian membuat TestControllerdi dalamnya.

TestController akan terlihat seperti ini:

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

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

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

Anda kemudian dapat mendaftarkan rute Anda dengan cara ini:

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

apakah ada cara untuk mencapai hal yang sama di atas untuk laravel 4.2
Sagar Arora

11
php artisan make:controller test\TestControllermembuat testTestController.php sambil php artisan make:controller 'test\TestController'bekerja. (Perhatikan Kutipannya) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

73

Tambahkan pengontrol Anda di folder Anda:

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

Buat rute Anda tanpa menentukan folder:

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

Lari

composer dump-autoload

Dan coba lagi


saya pikir Anda perlu artisan dump-autoloadjuga atau composer dump-autoloadcukup?
reikyoushin

1
Untuk / controller, cukup komposer. Tetapi jika Anda memiliki sesuatu ClassLoader::addDirectoriesyang tidak Anda miliki tentang komposer, Anda juga membutuhkan artisan.
Antonio Carlos Ribeiro

Tiba-tiba saya teringat saya pernah mengalami hal seperti ini .. lihat komentar saya tentang jawaban OP
reikyoushin

composer dump-autoloadbekerja untuk saya juga. Jika Anda menggunakan OS Windows, Anda dapat menggunakan file .bat untuk menjalankan composer dump-autoloadsebagai gantinya mengetik CMD setiap saat. Inilah yang saya gunakan: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa

7
Bagaimana jika kita memiliki dua pengontrol dengan nama yang sama di forlder1 dan folder2? Misalnya: admin / PostsController.php dan frontend / PostsController.php
zennin

50

Bagi mereka yang menggunakan Laravel 5 Anda perlu mengatur namespace untuk pengontrol dalam sub-direktori (Laravel 5 masih dalam pengembangan dan perubahan terjadi setiap hari)

Untuk mendapatkan struktur folder seperti:

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

namespace Admin \ PostsController.php seperti ini:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Maka rute Anda untuk ini adalah:

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

Dan terakhir, jangan pernah melakukan pekerjaan komposer atau pengrajin

composer dump-autoload

atau

php artisan dump

Bekerja untuk saya, mulai 1/23/15. Ini mungkin berubah nanti karena L5 belum keluar.
sehummel

Terima kasih untuk berita gembira kecil ini. Di LV4 Anda dapat melewati 'use App \ Http \ Controllers \ Controller;' pernyataan karena Anda memperluas BaseController yang mewarisi langsung dari Controller. Tidak demikian halnya di LV5 karena ia memperluas Kontroler secara langsung dan pemuatan otomatis PSR-4 perlu mengetahui di mana menemukan Kontroler.
Lionel Morrison

4
@user? php namespace Aplikasi \ Http \ Controller \ Admin; harus menjadi Pengendali dengan s di akhir
Sven van den Boogaart

Ini berhasil untuk saya, dengan peringatan bahwa saya harus menambahkan "-o" ke pernyataan komposer misalnya: komposer dump-autoload -o
Scott Byers

Ini tidak berhasil untuk saya, pesan kesalahan sekarang mengatakan App\Http\Controllers\Auth\Controllertidak ditemukan, mengapa itu menambahkan kata Controllerdi sana, dan kehilangan nama pengontrol yang sebenarnya? Saya pikir itu tebasan yang melakukan itu. -otidak membantu.
blamb

15

Untuk ** Laravel 5 atau Laravel 5.1 LTS keduanya **, jika Anda memiliki banyak Pengendali di folder Admin, Route::groupakan sangat membantu Anda. Sebagai contoh:

Pembaruan : Bekerja dengan Laravel 5.4

Struktur folder saya:

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

Di My Route.php, saya mengatur namespacegrup ke Api\V1dan secara keseluruhan terlihat seperti:

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

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

    });

Untuk memindahkan detail untuk membuat sub-folder kunjungi link ini .


1
Untuk Laravel 5.4, ini adalah satu-satunya solusi yang saya temukan sejauh ini.
mosh442

Solusi sempurna
Ali Adil

Memang sempurna!
Rytis Dereskevicius

Game changer ;-)
Strabek

9

1. buat subfolder Anda seperti berikut:

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

2. konfigurasi kode Anda di 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. tulis sth di app / controllers / admin / IndexController.php, mis:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. mengakses situs Anda, misalnya : localhost / admin / test Anda akan melihat "admin.home" di halaman

ps: Tolong abaikan bahasa Inggris saya yang buruk


2
Menggunakan namespace menghindari benturan penamaan. +1
FDisk

6

Baru saja menemukan cara melakukannya:

Cukup tambahkan jalur ke /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
Salah. Karena / controllers sudah ada di basis composer.json Laravel, apa pun di bawahnya akan otomatis dimuat. Anda tidak perlu menambahkan / controllers / product di global.php Anda.
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro Saya mengalami masalah ini saat mencoba memasukkan model ke dalam folder, tetapi membuang komposer dan pemuatan otomatis pengrajin tampaknya tidak berhasil. Anda harus meletakkannya di composer.json atau global.php
reikyoushin

2
Sangat mudah untuk memeriksa: setelah menjalankan composer du, buka vendor / composer / autoload_classmap.php dan kelas Anda harus terdaftar di sana.
Antonio Carlos Ribeiro

6
php artisan make:controller admin/CategoryController

Di sini admin adalah sub direktori di bawah app / Http / Controllers dan CategoryController adalah pengontrol yang ingin Anda buat di dalam direktori


6

Di Laravel 5.6, anggap nama subfolder Anda adalah Api:

Di pengontrol Anda, Anda membutuhkan dua baris ini:

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

Dan di file rute api.phpAnda, Anda memerlukan:

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

5

Saya menggunakan Laravel 4.2. Berikut cara melakukannya:
Saya memiliki struktur direktori seperti ini:
app
--controllers
---- admin
------ AdminController.php

Setelah saya membuat pengontrol, saya telah meletakkan di composer.json jalur ke direktori admin baru:

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

Selanjutnya saya sudah lari

composer dump-autoload

lalu

php artisan dump-autoload

Kemudian di routes.php saya memiliki pengontrol yang disertakan seperti ini:

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

Dan semuanya bekerja dengan baik.


Berfungsi untuk saya dan saya hanya perlu menjalankan 'composer dump-autoload -o'
phuang07

Hanya untuk kasus apapun saya juga menggunakan php artisan dump-autoload.
Todor Todorov

5

1) Begitulah cara Anda mengatur aplikasi:

Setiap file rute ( web.php, api.php...) dideklarasikan dalam sebuah map()metode, dalam sebuah file

\app\Providers\RouteServiceProvider.php

Saat Anda memetakan file rute, Anda dapat mengaturnya ->namespace($this->namespace), Anda akan melihatnya di sana di antara contoh.

Artinya, Anda dapat membuat lebih banyak file untuk membuat proyek Anda lebih terstruktur!

Dan tetapkan ruang nama yang berbeda untuk masing-masingnya.

Tapi saya lebih suka mengatur empty stringnamespace""

2) Anda dapat mengatur pengontrol Anda untuk merutekan dengan cara php asli, lihat contoh:

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

Sekarang Anda dapat mengklik dua kali nama pengontrol Anda di IDE untuk mencapainya dengan cepat dan nyaman.


Jawaban Terbaik! Benar-benar konsisten dengan Laravel dan dibangun di atas apa yang telah disediakan kerangka kerja di luar kotak.
jfoliveira

4

Jika Anda menggunakan Laravel 5.3 atau lebih tinggi, tidak perlu terlalu rumit seperti yang dikatakan jawaban lain. Cukup gunakan perintah artisan default untuk menghasilkan pengontrol baru. Misalnya, jika saya ingin membuat Userpengontrol di Userfolder. Saya akan mengetik

php artisan make:controller User/User

Di rute,

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

melakukan ini akan baik-baik saja dan sekarang di localhost / dasbor adalah tempat halaman berada.

Semoga ini membantu.


3

Saya pikir untuk menjaga pengontrol untuk Admin dan Front di folder terpisah, namespace akan berfungsi dengan baik.

Silakan lihat struktur direktori Laravel di bawah ini, yang berfungsi dengan baik untuk saya.

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

Rute dalam file "routes / web.php" adalah seperti di bawah ini

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

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

Dan untuk bagian Admin akan terlihat seperti

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

Semoga ini membantu!!


1

Saya mengalami masalah ini baru-baru ini dengan laravel 5.8 tetapi saya meremehkan dan saya harus mendefinisikan pengontrol dengan cara yang benar seperti ini di bawah ini:

php artisan make:controller SubFolder\MyController  // true

Tidak seperti ini:

php artisan make:controller SubFolder/MyController  // false

Kemudian Anda dapat mengakses pengontrol di routes / web.php seperti ini:

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

0

Dalam kasus saya, saya memiliki awalan yang harus ditambahkan untuk setiap rute dalam grup, jika tidak, responsnya adalah kelas UserController tidak ditemukan.

Route::prefix('/user')->group(function() {
    Route::post('/login', [UserController::class, 'login'])->prefix('/user');
    Route::post('/register', [UserController::class, 'register'])->prefix('/user');
});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.