लारवेल कंट्रोलर सबफ़ोल्डर रूटिंग


95

मैं लारावेल के लिए नया हूं। अपने ऐप को व्यवस्थित रखने के लिए मैं अपने नियंत्रक को नियंत्रक फ़ोल्डर के सबफ़ोल्डर्स में रखना चाहूंगा।

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

मैंने एक कंट्रोलर को रूट करने की कोशिश की, लेकिन लारवेल उसे नहीं मिला।

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

मैं क्या गलत कर रहा हूं?

जवाबों:


112

ऊपर 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');

क्या लार्वा 4.2 के लिए उपरोक्त समान हासिल करने का कोई तरीका है
सागर अरोड़ा

10
php artisan make:controller test\TestControllerphp artisan make:controller 'test\TestController'कार्य करता है जबकि testTestController.php बनाता है । (उद्धरण ध्यान दें) - लारवेल 5.4
जियोवानी एस

2
php artisan make:controller test/TestController
अमृत ​​श्रेष्ठ

72

अपने फ़ोल्डर में अपने नियंत्रक जोड़ें:

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

फ़ोल्डर निर्दिष्ट न करके अपना मार्ग बनाएँ:

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

Daud

composer dump-autoload

और फिर प्रयत्न करें


मुझे लगता है कि आपको artisan dump-autoloadभी ज़रूरत है या composer dump-autoloadपर्याप्त है?
रीकौयूसिन

1
/ नियंत्रकों के लिए, बस संगीतकार। लेकिन अगर आपके पास ClassLoader::addDirectoriesसंगीतकार में कुछ नहीं है, तो आपको कारीगर की भी आवश्यकता होगी।
एंटोनियो कार्लोस रिबेरो

मुझे अचानक याद आया कि मैंने कुछ इस तरह का सामना किया है .. ओपी के जवाब पर मेरी टिप्पणी देखें
reikyoushin

composer dump-autoloadमेरे लिए भी काम करो। यदि आप Windows OS का उपयोग करते हैं, तो आप composer dump-autoloadहर बार CMD में टाइप करने के लिए एक .bat फ़ाइल चलाने के लिए उपयोग कर सकते हैं । यह मैं उपयोग कर रहा हूँ: PUSHD "E:\path\to\non-public" newline START /B "Window 1" composer dump-autoload newline pause
vinsa

7
क्या होगा यदि हमारे पास for1 और फ़ोल्डर 2 में एक ही नाम के दो नियंत्रक हों? उदाहरण के लिए: व्यवस्थापक / PostsController.php और फ्रंटेंड / PostController.php
zennin

50

लारवेल 5 का उपयोग करने वालों के लिए आपको उप-निर्देशिका के भीतर नियंत्रक के लिए नाम स्थान निर्धारित करने की आवश्यकता है (लारवेल 5 अभी भी विकास में है और परिवर्तन दैनिक हो रहे हैं)

एक फ़ोल्डर संरचना प्राप्त करने के लिए जैसे:

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

namepace 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

1/23/15 तक, मेरे लिए काम किया। यह बाद में बदल सकता है क्योंकि L5 अभी तक बाहर नहीं है।
सेहुमेल

इस छोटे tidbit के लिए धन्यवाद। LV4 में आप 'App \ Http \ Controllers \ नियंत्रक' का उपयोग करने में सक्षम थे? बयान क्योंकि आपने बेसकंट्रोलर का विस्तार किया है जो सीधे नियंत्रक से विरासत में मिला है। LV5 में ऐसा नहीं है क्योंकि यह सीधे नियंत्रक का विस्तार करता है और PSR-4 ऑटोलॉडिंग को यह जानने की जरूरत है कि नियंत्रक को कहां खोजना है।
लियोनेल मॉरिसन

4
@user; php नेमस्पेस App \ Http \ नियंत्रक \ व्यवस्थापक; अंत में s के साथ नियंत्रक [s] होना चाहिए
स्वेन वैन den Boogaart

इसने मेरे लिए काम किया, उस कैविएट के साथ जिसे मुझे संगीतकार स्टेटमेंट में "-ओ" जोड़ना था जैसे: संगीतकार डंप-ऑटोलॉड -ओ
स्कॉट बायर्स

यह मेरे लिए काम नहीं करता था, त्रुटि संदेश अब App\Http\Controllers\Auth\Controllerयह नहीं कहता है कि यह Controllerवहां पर शब्द क्यों जोड़ा गया है , और नियंत्रक का वास्तविक नाम खो गया है? मुझे लगता है कि इसके स्लैश दैट ऐसा कर रहे हैं। -oक्या मदद नहीं की।
ब्लैंब नोव

15

** Laravel 5 या Laravel 5.1 LTS दोनों के लिए **, यदि आपके पास व्यवस्थापक फ़ोल्डर में कई नियंत्रक हैं, तो Route::groupवास्तव में आपके लिए उपयोगी होगा। उदाहरण के लिए:

अपडेट : लारवेल 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 {  
...

मेरा रूट। एफपी में, मैं 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
लारवेल 5.4 के लिए यह एकमात्र समाधान है जो मैंने अब तक पाया है।
mosh442

सही समाधान
अली आदिल

बिल्कुल सही!
रिटिस डेर्सेविसियस

गेम चेंजर ;-)
स्ट्रैबेक

9

1. अपने सबफ़ोल्डर को अनुसरण की तरह ही बनाएं:

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

2. एप्लिकेशन / मार्गों में अपना कोड कॉन्फ़िगर करें

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

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

3. एप्लिकेशन / नियंत्रकों / व्यवस्थापक / IndexController.php में उदाहरण के लिए लिखें:

<?php
namespace Admin;

class IndexController extends \BaseController {

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

4. अपनी साइट के साथ, जैसे host लोकलहोस्ट / एडमिन / टेस्ट, आपको पेज पर "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
गलत। चूँकि / नियंत्रकों पहले से ही लारवेल के कंपोज़र.जसन बेस में है, इसके नीचे कुछ भी स्वतः ऑटोलैड है। आपको अपने Global.php पर / नियंत्रकों / उत्पाद को जोड़ने की आवश्यकता नहीं है।
एंटोनियो कार्लोस रिबेरो

1
@AntonioCarlosRibeiro मुझे फ़ोल्डर्स में मॉडल डालने की कोशिश करने में यह समस्या हुई है , लेकिन संगीतकार और कारीगर ऑटोलॉड्स को डंप करने के लिए काम नहीं कर रहे हैं। आपको उन्हें कंपोजर.जॉन या ग्लोबल पर भेजना होगा। एफपी
रिक्वायसिन

2
यह जांचना आसान है: कंपोज़र डु चलाने के बाद, ओपन वेंडर / कंपोज़र / ऑटोलैड_क्लासमैप.फपी और आपकी क्लास को वहाँ सूचीबद्ध होना चाहिए।
एंटोनियो कार्लोस रिबेरो

6
php artisan make:controller admin/CategoryController

यहाँ व्यवस्थापन ऐप / Http / नियंत्रकों के अंतर्गत उप निर्देशिका है और श्रेणी नियंत्रक आप के अंदर निर्देशिका बनाना चाहते हैं


6

लारवेल 5.6 में, आपके सबफ़ोल्डर का नाम ग्रहण करना है Api:

आपके नियंत्रक में, आपको इन दो पंक्तियों की आवश्यकता है:

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

और आपकी रूट फ़ाइल में api.php, आपको आवश्यकता है:

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

5

मैं लारवेल 4.2 का उपयोग कर रहा हूं। यहाँ मैं यह कैसे करूँ:
मेरे पास इस तरह की एक निर्देशिका संरचना है:
app
--controllers
---- व्यवस्थापक
------ AdminController.php

मेरे द्वारा नियंत्रक बनाने के बाद मैंने कंपोज़र में डाल दिया है। नई व्यवस्थापक निर्देशिका के लिए पथ बनाएँ:

"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::controller('admin', 'AdminController');

और सब कुछ ठीक काम करता है।


मेरे लिए काम करता है और मुझे केवल 'संगीतकार डंप-
ऑटोलॉड

बस किसी भी मामले के लिए मैं भी php कारीगर डंप-ऑटोलॉड का उपयोग कर रहा हूं।
टोडोर टोडोरोव

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');

अब आप जल्दी और आसानी से वहां पहुंचने के लिए अपने आईडीई में अपने नियंत्रक नामों पर डबल क्लिक कर सकते हैं।


सबसे बढ़िया उत्तर! पूरी तरह से लारवेल के साथ संगत है और जो पहले से ही बॉक्स से बाहर प्रदान करता है उसके शीर्ष पर बनाया गया है।
17 मई को

4

यदि आप लारवेल 5.3 या इसके बाद के संस्करण का उपयोग कर रहे हैं, तो उतनी जटिलता में आने की आवश्यकता नहीं है, जितना कि अन्य उत्तरों ने कहा है। बस एक नया नियंत्रक उत्पन्न करने के लिए डिफ़ॉल्ट कारीगर कमांड का उपयोग करें। उदाहरण के लिए, यदि मैं फ़ोल्डर Userमें एक नियंत्रक बनाना चाहता हूं User। मैं टाइप करूंगा

php artisan make:controller User/User

मार्गों में,

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

ऐसा करना ठीक होगा और अब लोकलहोस्ट / डैशबोर्ड पर वह पेज है जहाँ पेज रहता है।

उम्मीद है की यह मदद करेगा।


3

मुझे लगता है कि अलग-अलग फ़ोल्डरों में एडमिन और फ्रंट के लिए कंट्रोलर रखने के लिए, नेमस्पेस अच्छा काम करेगा।

कृपया Laravel निर्देशिका संरचना के नीचे देखें, जो मेरे लिए ठीक काम करती है।

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

"रूट्स / 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

मुझे हाल ही में लार्वा 5.8 के साथ यह समस्या थी, लेकिन मुझे नीचे दिए गए तरीके से नियंत्रक को सही तरीके से परिभाषित करना चाहिए:

php artisan make:controller SubFolder\MyController  // true

इस तरह नहीं:

php artisan make:controller SubFolder/MyController  // false

तो आप इस तरह से मार्गों / web.php में नियंत्रक का उपयोग कर सकते हैं:

Route::get('/my', 'SubFolder\MyController@index');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.