Laravel Controller Alt klasör yönlendirme


96

Laravel'de yeniyim. Uygulamamı düzenli tutmayı denemek için, denetleyicilerimi denetleyici klasörünün alt klasörlerine koymak istiyorum.

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

Bir denetleyiciye yönlendirmeye çalıştım ama laravel onu bulamadı.

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

Neyi yanlış yapıyorum?

Yanıtlar:


115

Yukarıdaki Laravel 5.3 için:

php artisan make:controller test/TestController

Bu, testyoksa klasörü oluşturur, ardından TestControlleriçinde oluşturur .

TestController şöyle görünecek:

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

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

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

Daha sonra rotanızı şu şekilde kaydedebilirsiniz:

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

laravel 4.2 için yukarıdakine ulaşmanın bir yolu var mı
Sagar Arora

11
php artisan make:controller test\TestControllertestTestController.php oluşturur, oysa php artisan make:controller 'test\TestController'çalışır. (Alıntılara dikkat edin) - Laravel 5.4
Giovanni S

2
php artisan make:controller test/TestController
Amrit Shrestha

73

Denetleyicilerinizi klasörlerinize ekleyin:

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

Klasörü belirtmeden rotanızı oluşturun:

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

Çalıştırmak

composer dump-autoload

Ve yeniden dene


bence senin de ihtiyacın var mı artisan dump-autoloadyoksa composer dump-autoloadyeterli mi?
reikyoushin

1
/ Denetleyiciler için, sadece besteci. Ama içinde ClassLoader::addDirectoriesbestecide olmayan bir şey varsa, zanaatkara da ihtiyacınız olacak.
Antonio Carlos Ribeiro

Birdenbire böyle bir şeyle karşılaştığımı hatırladım .. OP'nin cevabı hakkındaki
yorumuma bakın

composer dump-autoloadbenim için de çalış. Windows işletim sistemi kullanıyorsanız, composer dump-autoloadher seferinde CMD yazmak yerine çalıştırmak için bir .bat dosyası kullanabilirsiniz . PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
Kullandığım

7
Ya forlder1 ve klasör2'de aynı ada sahip iki denetleyicimiz varsa? Örneğin: admin /
PostsController.php

50

Laravel 5 kullananlar için, alt dizindeki denetleyicinin ad alanını ayarlamanız gerekir (Laravel 5 hala geliştirme aşamasındadır ve değişiklikler günlük olarak yapılmaktadır)

Aşağıdaki gibi bir klasör yapısı elde etmek için:

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

namespace Admin \ PostsController.php dosyası şöyle:

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

use App\Http\Controllers\Controller;

class PostsController extends Controller {

    //business logic here
}

O zaman bunun için rotanız:

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

Ve son olarak, besteci ya da zanaatkâr dökümü yapmayın

composer dump-autoload

veya

php artisan dump

23.01.2015 itibariyle benim için çalıştı. L5 henüz çıkmadığı için bu daha sonra değişebilir.
sehummel

Bu küçük haber için teşekkürler. LV4'te 'App \ Http \ Controllers \ Controller'ı kullan' seçeneğini atlayabildiniz; doğrudan Controller'dan devralan BaseController'ı genişlettiğiniz için. LV5'te durum böyle değil çünkü Denetleyiciyi doğrudan genişletiyor ve PSR-4 otomatik yüklemesinin Denetleyiciyi nerede bulacağını bilmesi gerekiyor.
Lionel Morrison

4
@user? php ad alanı Uygulama \ Http \ Denetleyici \ Yönetici; Kontrolcü [ler] olmalı ve sonunda s
Sven van den Boogaart

Bu benim için çalıştı, besteci ifadesine "-o" eklemem gerektiğine dair uyarıda, örneğin: besteci dump-autoload -o
Scott Byers

Bu benim için işe yaramadı, hata mesajı şimdi App\Http\Controllers\Auth\Controllerbulunamadı diyor , neden Controllerorada kelimeyi ekliyor ve kontrolörün gerçek adını kaybediyor? Bunu yapan eğik çizgi olduğunu düşünüyorum. -oyardımcı olmadı.
2017'yi 1

15

** Laravel 5 veya Laravel 5.1 LTS için her ikisi de **, Admin klasöründe birden fazla Denetleyiciniz varsa, sizin Route::groupiçin gerçekten yararlı olacaktır. Örneğin:

Güncelleme : Laravel 5.4 ile çalışır

Klasör Yapım:

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'de namespacegrubu olarak ayarladım Api\V1ve genel olarak şöyle görünüyor:

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

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

    });

Alt klasör oluşturmak için taşıma ayrıntıları için bu bağlantıyı ziyaret edin .


1
Laravel 5.4 için şu ana kadar bulduğum tek çözüm bu.
mosh442

Mükemmel çözüm
Ali Adil

Gerçekten mükemmel!
Rytis Dereskevicius

Oyun değiştirici ;-)
Strabek

9

1. aşağıdaki gibi alt klasörünüzü oluşturun:

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

2. kodunuzu app / route.php içinde yapılandırın

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

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

3. app / controllers / admin / IndexController.php içine sth yazın, örneğin:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. sitenize erişin, örneğin : localhost / admin / test, sayfada "admin.home" göreceksiniz

ps: Lütfen zayıf İngilizcemi dikkate almayın


2
Ad alanını kullanmak adlandırma çakışmasını önler. +1
FDisk

6

Bunu yapmanın bir yolunu buldum:

Yolları /app/start/global.php dosyasına eklemeniz yeterli

ClassLoader::addDirectories(array(

    app_path().'/commands',
    app_path().'/controllers',
    app_path().'/controllers/product',
    app_path().'/models',
    app_path().'/database/seeds',

));

5
Yanlış. / Controllers zaten Laravel'in composer.json tabanında olduğundan, altındaki her şey otomatik olarak otomatik olarak yüklenir. Global.php dosyanıza / controllers / product eklemenize gerek yoktur.
Antonio Carlos Ribeiro

1
@AntonioCarlosRibeiro Modelleri klasörlere koymaya çalışırken bu sorunu yaşadım , ancak damping composer ve artisan autoloads işe yaramıyor. onları composer.json veya global.php üzerine koymalısınız
reikyoushin

2
Kontrol etmesi kolaydır: composer du çalıştırdıktan sonra, vendor / composer / autoload_classmap.php dosyasını açın ve sınıfınız burada listelenmelidir.
Antonio Carlos Ribeiro

6
php artisan make:controller admin/CategoryController

Burada yönetici, app / Http / Controllers altındaki alt dizindir ve CategoryController, dizin içinde oluşturmak istediğiniz denetleyicidir.


6

Laravel 5.6'da, alt klasörünüzün adını varsayarsak, Api :

Denetleyicinizde şu iki satıra ihtiyacınız var:

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

Ve rota dosyanızda api.php şunlara ihtiyacınız var:

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

5

Laravel 4.2 kullanıyorum. İşte nasıl yaparım:
Bunun gibi bir dizin yapısına sahibim:
app
--controllers
---- admin
------ AdminController.php

Denetleyiciyi oluşturduktan sonra composer.json'a yeni yönetici dizininin yolunu koydum:

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

Sonra koştum

composer dump-autoload

ve sonra

php artisan dump-autoload

Sonra route.php'de şu şekilde bir denetleyiciye sahibim:

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

Ve her şey yolunda gidiyor.


Benim için çalışıyor ve sadece 'composer dump-autoload -o'
komutunu

Her durumda ben de php artisan dump-autoload kullanıyorum.
Todor Todorov

5

1) Uygulamanızı bu şekilde organize edebilirsiniz:

Her yol dosyası ( web.php, api.php...) bir map()yöntemde, bir dosyada bildirilir

\app\Providers\RouteServiceProvider.php

Bir rota dosyası haritalandırırken, bir ->namespace($this->namespace) , onun için bir belirleyebilir, orada örnekler arasında göreceksiniz.

Bu, projenizi daha yapılandırılmış hale getirmek için daha fazla dosya oluşturabileceğiniz anlamına gelir!

Ve her biri için farklı ad alanları ayarlayın.

Ama empty stringad alanı için ayarlamayı tercih ederim""

2) Denetleyicilerinizi yerel bir php biçiminde yönlendirecek şekilde ayarlayabilirsiniz, örneğe bakın:

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

Artık IDE'nizdeki denetleyici adlarınıza çift tıklayarak oraya hızlı ve rahat bir şekilde ulaşabilirsiniz.


En iyi cevap! Laravel ile tamamen tutarlıdır ve çerçevenin kutudan çıkardığı şeyin üzerine inşa edilmiştir.
jfoliveira

4

Laravel 5.3 veya üstünü kullanıyorsanız, diğer cevapların söylediği gibi bu kadar karmaşıklığa girmenize gerek yoktur. Yeni bir kontrolör oluşturmak için sadece varsayılan artisan komutunu kullanın. Örneğin, klasörde bir Userdenetleyici oluşturmak istersem User. Yazardım

php artisan make:controller User/User

Rotalarda,

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

sadece bunu yapmak iyi olur ve şimdi localhost / dashboard'da sayfanın bulunduğu yerdir.

Bu yardımcı olur umarım.


3

Yönetici ve Ön için denetleyicileri ayrı klasörlerde tutmayı düşünüyorum, ad alanı iyi çalışacaktır.

Lütfen benim için iyi çalışan aşağıdaki Laravel dizin yapısına bakın.

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

"Route / web.php" dosyasındaki yollar aşağıdaki gibi olacaktır

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

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

Yönetici bölümü için ise şöyle görünecektir:

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

Bu yardımcı olur umarım!!


1

Son zamanlarda bu problemi laravel 5.8 ile yaşadım ama anladım ve kontrolörü aşağıdaki gibi doğru bir şekilde tanımlamalıyım:

php artisan make:controller SubFolder\MyController  // true

Böyle değil:

php artisan make:controller SubFolder/MyController  // false

Daha sonra kontrolöre aşağıdaki gibi route / web.php üzerinden erişebilirsiniz:

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

0

Benim durumumda, gruptaki her yol için eklenmesi gereken bir önek vardı, aksi takdirde yanıt, UserController sınıfının bulunamaması olabilirdi.

Route::prefix('/user')->group(function() {
    Route::post('/login', [UserController::class, 'login'])->prefix('/user');
    Route::post('/register', [UserController::class, 'register'])->prefix('/user');
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.