Định tuyến thư mục con bộ điều khiển Laravel


95

Tôi mới sử dụng Laravel. Để thử và giữ cho ứng dụng của tôi có tổ chức, tôi muốn đặt bộ điều khiển của mình vào các thư mục con của thư mục bộ điều khiển.

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

Tôi đã cố gắng định tuyến đến một bộ điều khiển, nhưng laravel không tìm thấy nó.

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

Tôi đang làm gì sai?

Câu trả lời:


112

Đối với Laravel 5.3 ở trên:

php artisan make:controller test/TestController

Điều này sẽ tạo testthư mục nếu nó không tồn tại, sau đó tạo TestControllerbên trong.

TestController sẽ trông như thế này:

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

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

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

Sau đó, bạn có thể đăng ký tuyến đường của mình theo cách này:

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

có cách nào để đạt được điều trên cho laravel 4.2
Sagar Arora

10
php artisan make:controller test\TestControllertạo testTestController.php trong khi php artisan make:controller 'test\TestController'hoạt động. (Lưu ý các trích dẫn) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

72

Thêm bộ điều khiển của bạn vào các thư mục của bạn:

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

Tạo tuyến đường của bạn không chỉ định thư mục:

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

Chạy

composer dump-autoload

Và thử lại


tôi nghĩ bạn cần artisan dump-autoloadquá hay là composer dump-autoloadđủ?
reikyoushin 17/09/13

1
Đối với / bộ điều khiển, chỉ là nhà soạn nhạc. Nhưng nếu bạn có thứ gì đó ClassLoader::addDirectoriesmà bạn không có ở nhà soạn nhạc, bạn cũng sẽ cần đến nghệ nhân.
Antonio Carlos Ribeiro

Tôi đã chợt nhớ tôi đã gặp phải một cái gì đó như thế này .. xem xét của tôi về câu trả lời của OP
reikyoushin

composer dump-autoloadlàm việc cho tôi quá. Nếu bạn sử dụng hệ điều hành Windows, bạn có thể sử dụng tệp .bat để chạy composer dump-autoloadthay thế để nhập CMD mọi lúc. Đây là những gì tôi đang sử dụng: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa

7
Điều gì sẽ xảy ra nếu chúng ta có hai bộ điều khiển có cùng tên trong forlder1 và folder2? Ví dụ: admin / PostsController.php và frontend / PostsController.php
zennin

50

Đối với những người sử dụng Laravel 5, bạn cần đặt không gian tên cho bộ điều khiển trong thư mục con (Laravel 5 vẫn đang được phát triển và các thay đổi đang diễn ra hàng ngày)

Để có cấu trúc thư mục như:

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

không gian tên Admin \ PostsController.php tệp như vậy:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

Sau đó, lộ trình của bạn cho điều này là:

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

Và cuối cùng, đừng làm cả nhà soạn nhạc hay nghệ nhân

composer dump-autoload

hoặc là

php artisan dump

Làm việc cho tôi, kể từ ngày 23/2/15. Điều này có thể thay đổi sau đó vì L5 vẫn chưa ra mắt.
sehummel

Cảm ơn vì mẩu tin nhỏ này. Trong LV4, bạn có thể bỏ qua 'sử dụng App \ Http \ Controllers \ Controller;' vì bạn đã mở rộng BaseController kế thừa trực tiếp từ Controller. Không phải trường hợp trong LV5 vì nó mở rộng Bộ điều khiển trực tiếp và tự động tải PSR-4 cần biết nơi tìm Bộ điều khiển.
Lionel Morrison

4
@user? php namespace App \ Http \ Controller \ Admin; nên điều khiển [s] với s ở cuối
Sven van den Boogaart

Điều này làm việc cho tôi, với sự báo trước rằng tôi phải thêm "-o" để tuyên bố nhà soạn nhạc, ví dụ: nhà soạn nhạc tự đổ autoload -o
Scott Byers

Điều này không hiệu quả với tôi, thông báo lỗi hiện App\Http\Controllers\Auth\Controllerkhông tìm thấy, tại sao nó lại thêm từ Controllervào đó và làm mất tên thực của bộ điều khiển? Tôi nghĩ rằng đó là dấu gạch chéo làm điều đó. -okhông giúp được gì.
blamb

15

Đối với ** cả Laravel 5 hoặc Laravel 5.1 LTS **, nếu bạn có nhiều Bộ điều khiển trong thư mục Quản trị, Route::groupsẽ thực sự hữu ích cho bạn. Ví dụ:

Cập nhật : Hoạt động với Laravel 5.4

Cấu trúc thư mục của tôi:

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

Trong My Route.php, tôi đặt namespacenhóm thành Api\V1và tổng thể nó trông giống như:

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

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

    });

Để biết chi tiết di chuyển để tạo thư mục con, hãy truy cập liên kết này .


1
Đối với Laravel 5.4, đó là giải pháp duy nhất tôi tìm thấy cho đến nay.
mosh442

Giải pháp hoàn hảo
Ali Adil

Quả thực hoàn hảo!
Rytis Dereskevicius

Người thay đổi trò chơi ;-)
Strabek

9

1. tạo thư mục con của bạn giống như sau:

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

2. định cấu hình mã của bạn trong 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. viết sth trong app / controllers / admin / IndexController.php, ví dụ:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. truy cập trang web của bạn, ví dụ: : localhost / admin / test, bạn sẽ thấy "admin.home" trên trang

ps: Xin vui lòng bỏ qua tiếng Anh kém của tôi


2
Sử dụng không gian tên để tránh xung đột đặt tên. +1
FDisk

6

Chỉ cần tìm thấy một cách để làm điều đó:

Chỉ cần thêm các đường dẫn vào /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
Sai lầm. Vì / bộ điều khiển đã có trong cơ sở composer.json của Laravel, mọi thứ bên dưới nó sẽ tự động được tải tự động. Bạn không cần thêm / controllers / product trên global.php của mình.
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro Tôi đã gặp sự cố này khi cố gắng đưa các mô hình vào các thư mục, nhưng kết xuất các bản autoload của nhà soạn nhạc và nghệ nhân dường như không hoạt động. bạn phải đặt chúng trên composer.json hoặc trên global.php
reikyoushin

2
Thật dễ dàng để kiểm tra: sau khi chạy composer du, hãy mở nhà cung cấp / composer / autoload_classmap.php và lớp của bạn phải được liệt kê ở đó.
Antonio Carlos Ribeiro

6
php artisan make:controller admin/CategoryController

Ở đây admin là thư mục con trong app / Http / Controllers và CategoryController là controller mà bạn muốn tạo bên trong thư mục


6

Trong Laravel 5.6, giả sử tên của thư mục con 'của bạn là Api:

Trong bộ điều khiển của bạn, bạn cần hai dòng sau:

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

Và trong tệp tuyến đường của bạn api.php, bạn cần:

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

5

Tôi đang sử dụng Laravel 4.2. Đây là cách tôi thực hiện:
Tôi có cấu trúc thư mục như thế này:
app
--controllers
---- admin
------ AdminController.php

Sau khi tôi đã tạo bộ điều khiển, tôi đã đặt vào composer.json đường dẫn đến thư mục quản trị mới:

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

Tiếp theo tôi đã chạy

composer dump-autoload

và sau đó

php artisan dump-autoload

Sau đó, trong route.php, tôi có bộ điều khiển bao gồm như thế này:

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

Và mọi thứ hoạt động tốt.


Công trình đối với tôi và tôi chỉ cần chạy 'nhà soạn nhạc tự đổ autoload -o'
phuang07

Chỉ cho bất kỳ trường hợp nào tôi cũng đang sử dụng php Artian dump-autoload.
Todor Todorov

5

1) Đó là cách bạn có thể sắp xếp ứng dụng của mình:

Mọi tệp tuyến ( web.php, api.php...) được khai báo trong một map()phương thức, trong một tệp

\app\Providers\RouteServiceProvider.php

Khi bạn ánh xạ một tệp tuyến đường, bạn có thể đặt một ->namespace($this->namespace)tệp cho nó, bạn sẽ thấy nó ở đó trong số các ví dụ.

Nó có nghĩa là bạn có thể tạo nhiều tệp hơn để làm cho dự án của bạn có cấu trúc hơn!

Và đặt các không gian tên khác nhau cho mỗi người trong số họ.

Nhưng tôi thích đặt empty stringcho không gian tên hơn""

2) Bạn có thể đặt bộ điều khiển của mình định tuyến theo cách php gốc, hãy xem ví dụ:

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

Bây giờ bạn có thể nhấp đúp vào tên bộ điều khiển của mình trong IDE để đến đó một cách nhanh chóng và thuận tiện.


Câu trả lời tốt nhất! Hoàn toàn phù hợp với Laravel và được xây dựng dựa trên những gì mà khung công tác đã cung cấp sẵn.
jfoliveira

4

Nếu bạn đang sử dụng Laravel 5.3 trở lên, không cần phải quá phức tạp như các câu trả lời khác đã nói. Chỉ cần sử dụng lệnh thủ công mặc định để tạo bộ điều khiển mới. Ví dụ: nếu tôi muốn tạo một Userbộ điều khiển trong Userthư mục. Tôi sẽ gõ

php artisan make:controller User/User

Trong các tuyến đường,

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

chỉ làm điều này sẽ ổn và bây giờ trên localhost / dashboard là nơi cư trú của trang.

Hi vọng điêu nay co ich.


3

Tôi nghĩ rằng để giữ bộ điều khiển cho Admin và Front trong các thư mục riêng biệt, không gian tên sẽ hoạt động tốt.

Vui lòng xem cấu trúc thư mục Laravel bên dưới, cấu trúc đó phù hợp với tôi.

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

Các tuyến trong tệp "route / web.php" sẽ như dưới đây

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

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

Và đối với phần Quản trị, nó sẽ giống như

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

Hi vọng điêu nay co ich!!


1

Tôi đã gặp sự cố này gần đây với laravel 5.8 nhưng tôi không quan tâm và tôi nên xác định bộ điều khiển theo cách đúng như sau:

php artisan make:controller SubFolder\MyController  // true

Không phải như thế này:

php artisan make:controller SubFolder/MyController  // false

Sau đó, bạn có thể truy cập bộ điều khiển trong các tuyến đường / web.php như sau:

Route::get('/my', 'SubFolder\MyController@index');
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.