การกำหนดเส้นทางโฟลเดอร์ย่อยของ Laravel Controller


96

ฉันเพิ่งเริ่มใช้ Laravel ในการพยายามจัดระเบียบแอปของฉันฉันต้องการวางคอนโทรลเลอร์ไว้ในโฟลเดอร์ย่อยของโฟลเดอร์คอนโทรลเลอร์

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

ฉันพยายามกำหนดเส้นทางไปยังคอนโทรลเลอร์ แต่ไม่พบ laravel

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

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


115

สำหรับ Laravel 5.3 ด้านบน:

php artisan make:controller test/TestController

สิ่งนี้จะสร้างtestโฟลเดอร์หากไม่มีอยู่จากนั้นสร้างTestControllerภายใน

TestController จะมีลักษณะดังนี้:

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

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

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

จากนั้นคุณสามารถลงทะเบียนเส้นทางของคุณด้วยวิธีนี้:

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

มีวิธีใดบ้างที่จะบรรลุสิ่งเดียวกันข้างต้นสำหรับ laravel 4.2
Sagar Arora

11
php artisan make:controller test\TestControllerสร้าง testTestController.php ในขณะที่php artisan make:controller 'test\TestController'ทำงาน (หมายเหตุคำคม) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

73

เพิ่มคอนโทรลเลอร์ของคุณในโฟลเดอร์ของคุณ:

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

สร้างเส้นทางของคุณโดยไม่ระบุโฟลเดอร์:

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

วิ่ง

composer dump-autoload

แล้วลองอีกครั้ง


ฉันคิดว่าคุณต้องการartisan dump-autoloadมากเกินไปหรือcomposer dump-autoloadเพียงพอแล้ว?
reikyoushin

1
สำหรับ / คอนโทรลเลอร์เพียงผู้แต่ง แต่ถ้าคุณไม่มีอะไรในตัวClassLoader::addDirectoriesคุณเองก็ต้องมีช่างฝีมือเช่นกัน
Antonio Carlos Ribeiro

จู่ๆฉันก็จำได้ว่าเคยเจออะไรแบบนี้ .. ดูความคิดเห็นของฉันในคำตอบของ OP
reikyoushin

composer dump-autoloadทำงานให้ฉันด้วย หากคุณใช้ Windows OS คุณสามารถใช้ไฟล์. bat เพื่อเรียกใช้composer dump-autoloadแทนเพื่อพิมพ์ CMD ทุกครั้ง นี่คือสิ่งที่ฉันใช้: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa

7
จะเกิดอะไรขึ้นถ้าเรามีคอนโทรลเลอร์สองตัวที่มีชื่อเดียวกันใน forlder1 และ folder2 ตัวอย่างเช่น admin / PostsController.php และ frontend / PostsController.php
zennin

50

สำหรับผู้ที่ใช้ Laravel 5 คุณต้องตั้งค่าเนมสเปซสำหรับคอนโทรลเลอร์ภายในไดเร็กทอรีย่อย (Laravel 5 ยังอยู่ในระหว่างการพัฒนาและมีการเปลี่ยนแปลงเกิดขึ้นทุกวัน)

ในการรับโครงสร้างโฟลเดอร์เช่น:

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

ไฟล์ namespace Admin \ PostsController.php ดังนี้:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

เส้นทางของคุณสำหรับสิ่งนี้คือ:

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

และสุดท้ายอย่าไปทำทั้งนักแต่งเพลงหรือช่างฝีมือ

composer dump-autoload

หรือ

php artisan dump

ทำงานให้ฉันเมื่อวันที่ 23/1/58 สิ่งนี้อาจเปลี่ยนแปลงได้ในภายหลังเนื่องจาก L5 ยังไม่ออก
sehummel

ขอบคุณสำหรับเรื่องเล็กน้อยนี้ ใน LV4 คุณสามารถข้าม 'use App \ Http \ Controllers \ Controller;' ได้ เนื่องจากคุณขยาย BaseController ซึ่งสืบทอดโดยตรงจาก Controller ไม่ใช่กรณีใน LV5 เนื่องจากขยาย Controller โดยตรงและการโหลดอัตโนมัติ PSR-4 จำเป็นต้องทราบว่าจะหา Controller ได้จากที่ใด
Lionel Morrison

4
@user? php namespace App \ Http \ Controller \ Admin; ควรเป็น Controller [s] ด้วย s ในตอนท้าย
Sven van den Boogaart

สิ่งนี้ใช้ได้ผลสำหรับฉันโดยมีข้อแม้ที่ฉันต้องเพิ่ม "-o" ในคำสั่งของนักแต่งเพลงเช่น: นักแต่งเพลง dump-autoload -o
Scott Byers

สิ่งนี้ไม่ได้ผลสำหรับฉันตอนนี้ข้อความแสดงข้อผิดพลาดแจ้งว่าApp\Http\Controllers\Auth\Controllerไม่พบเหตุใดจึงต่อท้ายคำControllerที่นั่นและสูญเสียชื่อจริงของคอนโทรลเลอร์ ฉันคิดว่ามันเป็นการเฉือนที่ทำอย่างนั้น -oไม่ได้ช่วย
ตำหนิ

15

สำหรับ ** Laravel 5 หรือ Laravel 5.1 LTS ทั้งคู่ ** หากคุณมี Controllers หลายตัวในโฟลเดอร์ Admin Route::groupจะเป็นประโยชน์สำหรับคุณมาก ตัวอย่างเช่น:

อัปเดต : ทำงานร่วมกับ Laravel 5.4

โครงสร้างโฟลเดอร์ของฉัน:

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

ใน My Route.php ฉันตั้งnamespaceกลุ่มเป็นApi\V1และโดยรวมแล้วดูเหมือนว่า:

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

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

    });

สำหรับรายละเอียดการย้ายเพื่อสร้างโฟลเดอร์ย่อยโปรดไปที่ลิงค์นี้


1
สำหรับ Laravel 5.4 มันเป็นทางออกเดียวที่ฉันพบจนถึงตอนนี้
mosh442

โซลูชั่นที่สมบูรณ์แบบ
Ali Adil

สมบูรณ์แบบแน่นอน!
Rytis Dereskevicius

ตัวเปลี่ยนเกม ;-)
Strabek

9

1. สร้างโฟลเดอร์ย่อยของคุณเช่นเดียวกับสิ่งต่อไปนี้:

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

2. กำหนดค่ารหัสของคุณใน app / route.php

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

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

3. เขียน sth ใน app / controllers / admin / IndexController.php เช่น:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. เข้าถึงไซต์ของคุณเช่น: localhost / admin / test คุณจะเห็น "admin.home" ในหน้า

ps: โปรดอย่าสนใจภาษาอังกฤษที่แย่ของฉัน


2
การใช้เนมสเปซหลีกเลี่ยงความขัดแย้งในการตั้งชื่อ +1
FDisk

6

เพิ่งค้นพบวิธีการทำ:

เพียงเพิ่มเส้นทางไปที่ /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
ไม่ถูกต้อง. เนื่องจาก / controllers อยู่ในฐาน comper.json ของ Laravel แล้วสิ่งใดก็ตามที่อยู่ด้านล่างจะถูกโหลดอัตโนมัติโดยอัตโนมัติ คุณไม่จำเป็นต้องเพิ่ม / controllers / product บน global.php ของคุณ
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro ฉันมีปัญหากับการพยายามใส่โมเดลในโฟลเดอร์ แต่การทิ้งนักแต่งเพลงและช่างอัตโนมัติดูเหมือนจะไม่ทำงาน คุณต้องใส่ไว้ใน composer.json หรือ global.php
reikyoushin

2
ง่ายต่อการตรวจสอบ: หลังจากเรียกใช้ composer du แล้วให้เปิด vendor / composer / autoload_classmap.php และคลาสของคุณจะต้องอยู่ในรายการ
Antonio Carlos Ribeiro

6
php artisan make:controller admin/CategoryController

นี่คือผู้ดูแลระบบย่อยภายใต้ app / Http / Controllers และ CategoryController คือคอนโทรลเลอร์ที่คุณต้องการสร้างภายในไดเร็กทอรี


6

ใน Laravel 5.6 สมมติว่าชื่อโฟลเดอร์ย่อยของคุณคือApi:

ในคอนโทรลเลอร์ของคุณคุณต้องมีสองบรรทัดนี้:

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

และในไฟล์เส้นทางของapi.phpคุณคุณต้อง:

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

5

ฉันใช้ Laravel 4.2 ฉันทำอย่างไร:
ฉันมีโครงสร้างไดเร็กทอรีเช่นนี้:
app
--controllers
---- admin
------ AdminController.php

หลังจากที่ฉันสร้างคอนโทรลเลอร์ฉันได้ใส่ composer.json เส้นทางไปยังไดเรกทอรีผู้ดูแลระบบใหม่:

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

ต่อไปฉันจะวิ่ง

composer dump-autoload

แล้ว

php artisan dump-autoload

จากนั้นใน route.php ฉันมีคอนโทรลเลอร์รวมอยู่ในนี้:

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

และทุกอย่างทำงานได้ดี


ใช้ได้ผลสำหรับฉันและฉันต้องเรียกใช้ 'composer dump-autoload -o' เท่านั้น
phuang07

สำหรับทุกกรณีฉันใช้ php artisan dump-autoload ด้วย
Todor Todorov

5

1) นั่นคือวิธีที่คุณสามารถจัดระเบียบแอปของคุณ:

ทุกไฟล์เส้นทาง ( web.php, api.php... ) ถูกประกาศในmap()วิธีการในไฟล์

\app\Providers\RouteServiceProvider.php

เมื่อคุณแมปไฟล์เส้นทางคุณสามารถตั้งค่า->namespace($this->namespace)ได้คุณจะเห็นไฟล์นั้นในตัวอย่าง

หมายความว่าคุณสามารถสร้างไฟล์เพิ่มเติมเพื่อทำให้โครงการของคุณมีโครงสร้างมากขึ้น!

และตั้งค่าเนมสเปซที่แตกต่างกันสำหรับแต่ละชื่อ

แต่ฉันชอบตั้งค่าempty stringสำหรับเนมสเปซมากกว่า""

2) คุณสามารถตั้งค่าตัวควบคุมของคุณให้กำหนดเส้นทางด้วยวิธี php ดั้งเดิมดูตัวอย่าง:

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

ตอนนี้คุณสามารถดับเบิลคลิกที่ชื่อคอนโทรลเลอร์ใน IDE ของคุณเพื่อไปที่นั่นได้อย่างรวดเร็วและสะดวก


ตอบดีที่สุด! สอดคล้องกับ Laravel โดยสิ้นเชิงและสร้างขึ้นจากสิ่งที่เฟรมเวิร์กจัดเตรียมไว้ให้แล้วนอกกรอบ
jfoliveira

4

หากคุณใช้ Laravel 5.3 ขึ้นไปก็ไม่จำเป็นต้องมีความซับซ้อนมากมายเหมือนที่คำตอบอื่น ๆ ได้กล่าวไว้ เพียงใช้คำสั่งช่างฝีมือเริ่มต้นเพื่อสร้างคอนโทรลเลอร์ใหม่ เช่นถ้าฉันต้องการสร้างUserคอนโทรลเลอร์ในUserโฟลเดอร์ ฉันจะพิมพ์

php artisan make:controller User/User

ในเส้นทาง

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

การทำเช่นนี้จะเป็นการดีและตอนนี้บน localhost / dashboard คือที่ที่เพจนั้นอยู่

หวังว่านี่จะช่วยได้


3

ฉันคิดว่าจะเก็บคอนโทรลเลอร์สำหรับ Admin และ Front ไว้ในโฟลเดอร์แยกกันเนมสเปซจะทำงานได้ดี

โปรดดูโครงสร้างไดเร็กทอรี Laravel ด้านล่างซึ่งใช้ได้ดีสำหรับฉัน

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

เส้นทางในไฟล์ "route / web.php" จะเป็นดังนี้

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

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

และสำหรับส่วนของผู้ดูแลระบบจะมีลักษณะดังนี้

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

หวังว่านี่จะช่วยได้ !!


1

เมื่อเร็ว ๆ นี้ฉันมีปัญหากับ laravel 5.8 แต่ฉันประมาทและควรกำหนดคอนโทรลเลอร์ให้ถูกต้องดังนี้:

php artisan make:controller SubFolder\MyController  // true

ไม่เหมือนนี่:

php artisan make:controller SubFolder/MyController  // false

จากนั้นคุณสามารถเข้าถึงคอนโทรลเลอร์ในเส้นทาง / web.php ดังนี้:

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

0

ในกรณีของฉันฉันมีคำนำหน้าที่ต้องเพิ่มสำหรับแต่ละเส้นทางในกลุ่มมิฉะนั้นการตอบสนองจะเป็นว่าไม่พบคลาส UserController

Route::prefix('/user')->group(function() {
    Route::post('/login', [UserController::class, 'login'])->prefix('/user');
    Route::post('/register', [UserController::class, 'register'])->prefix('/user');
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.