लक्ष्य वर्ग नियंत्रक मौजूद नहीं है - लारवेल 8


109

यहाँ मेरा नियंत्रक है:

<?php

namespace App\Http\Controllers\Api;

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

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        dd('aa');
    }
}

जैसा कि स्क्रीनशॉट में देखा गया है, वर्ग मौजूद है और सही जगह पर है:

यहाँ छवि विवरण दर्ज करें

मेरा api.phpमार्ग:

Route::get('register', 'Api\RegisterController@register');

जब मैंने registerपोस्टमैन का उपयोग करके अपने मार्ग को मारा , तो इससे मुझे निम्नलिखित त्रुटि मिली:

लक्ष्य वर्ग [Api \ RegisterController] मौजूद नहीं है।


अपडेट करें:

जवाब के लिए धन्यवाद, मैं इसे ठीक करने में सक्षम था। मैंने इस मार्ग के लिए पूरी तरह से योग्य वर्ग नाम का उपयोग करने का निर्णय लिया, लेकिन उत्तर में वर्णित अन्य विकल्प भी हैं।

Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');

SO में आपका स्वागत है .. क्या Apiफ़ोल्डर के अंदर आपका नियंत्रक है ।?
कमलेश पॉल

आपको कक्षाओं को पुनर्जीवित करने की आवश्यकता है जैसा कि composer dump-autoloadया आपके RegisterControllerनाम में अनुपलब्ध है।
sta

@ कमलेशपॉल हां
गुयेन

फिर कोशिश करेंcomposer dump-autoload
कमलेश पॉल

क्या मैं इसे अपने टर्मिनल में टाइप करता हूँ?
गुयेन

जवाबों:


208

आप Laravel 8 का उपयोग कर रहे हैं। Laravel 8 की एक ताज़ा स्थापना में, आपके रूट समूहों पर कोई नामस्थान उपसर्ग लागू नहीं किया जा रहा है जिससे आपके रूट लोड किए गए हैं।

"लारवेल के पिछले रिलीज में, RouteServiceProviderएक $namespaceसंपत्ति थी। इस संपत्ति का मूल्य स्वचालित रूप से नियंत्रक मार्ग परिभाषाओं और actionसहायक / कॉल पर उपसर्ग किया जाएगा URL::action। लारवेल 8.x में, यह संपत्ति nullडिफ़ॉल्ट रूप से है। इसका मतलब है कि कोई स्वचालित स्वचालित उपसर्ग नहीं है। लारवेल द्वारा किया जाएगा। ” Laravel 8.x डॉक्स - नोट्स जारी करें

जब नामस्थान उपसर्ग का उपयोग नहीं कर रहे हों तो आपको अपने मार्गों में उनका संदर्भ देते समय अपने नियंत्रकों के लिए पूरी तरह से योग्य वर्ग नाम का उपयोग करना होगा।

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
// or
Route::get('/users', 'App\Http\Controllers\UserController@index');

यदि आप पुराने तरीके से पसंद करते हैं:

App\Providers\RouteServiceProvider:

public function boot()
{
    ...

    Route::prefix('api')
        ->middleware('api')
        ->namespace('App\Http\Controllers') // <---------
        ->group(base_path('routes/api.php'));

    ...
}

किसी भी रूट समूह के लिए ऐसा करें, जिसके लिए आप एक घोषित नाम स्थान चाहते हैं।

$namespaceसंपत्ति:

हालाँकि रिलीज़ नोट में $namespaceआपके द्वारा सेट की गई संपत्ति का RouteServiceProviderउल्लेख है और आपकी टिप्पणी में RouteServiceProviderइसका आपके मार्गों पर कोई प्रभाव नहीं पड़ता है। यह वर्तमान में क्रियाओं के लिए URL बनाने के लिए केवल एक नामस्थान उपसर्ग जोड़ने के लिए है। तो आप इस चर को सेट कर सकते हैं, लेकिन यह स्वयं इन नामस्थान उपसर्गों को नहीं जोड़ेगा, फिर भी आपको यह सुनिश्चित करना होगा कि आप इस चर का उपयोग मार्ग समूहों में नामस्थान जोड़ते समय करेंगे।

यह जानकारी अब अपग्रेड गाइड में है

Laravel 8.x डॉक्स - अपग्रेड गाइड - रूटिंग

अपग्रेड गाइड जिस महत्वपूर्ण भाग को दिखा रहा है, वह यह है कि आप अपने मार्गों के समूहों के नाम स्थान को परिभाषित कर रहे हैं। केवल$namespace स्वयं द्वारा चर सेट करना URL को क्रियाओं को उत्पन्न करने में मदद करता है।

फिर, और मैं इसे पर्याप्त तनाव नहीं दे सकता, महत्वपूर्ण हिस्सा रूट समूहों के लिए नामस्थान सेट कर रहा है, जो कि वे केवल $namespaceउदाहरण में सीधे सदस्य चर को संदर्भित करके कर रहे हैं ।

अपडेट करें:

यदि आपने संस्करण 8.0.2 के बाद से लारवेल 8 की एक नई प्रतिलिपि स्थापित की है, तो आप पुराने तरीके से वापस जाने के लिए सदस्य चर laravel/laravelको अनसुना कर सकते हैं, क्योंकि समूहों के लिए नामस्थान के लिए इस सदस्य चर का उपयोग करने के लिए मार्ग समूह सेटअप हैं।protected $namespaceRouteServiceProvider

// protected $namespace = 'App\\Http\\Controllers';

केवल एक ही कारण है कि मार्गों को सौंपे गए नियंत्रकों में नामस्थान उपसर्ग जोड़ देगा क्योंकि मार्ग समूह इस चर को नामस्थान के रूप में उपयोग करने के लिए सेटअप हैं:

...
->namespace($this->namespace)
...

2
यह वास्तव में मुझे पागल कर रहा था। $ नेमस्पेस वैरिएबल के ऊपर टिप्पणी कहती है: "यदि निर्दिष्ट किया गया है, तो यह नेमस्पेस स्वचालित रूप से आपके नियंत्रक मार्गों पर लागू होता है।" वैसे यह नहीं है। जैसा आपने बताया कि आपको -> नाम स्थान ('App \ Http \ Controllers') जोड़ना होगा। उन्हें वास्तव में स्रोत कोड में टिप्पणी बदलनी चाहिए ...
सदमे_गोन_विल्ड

@shock_gone_wild उस टिप्पणी और संपत्ति को प्रदाता से लगभग 25 मिनट पहले हटा दिया गया था, इसलिए इसके अगले पैच संस्करण में laravel/laravelचला जाएगा
19

1
संशोधन क्यों बदला गया? प्रदर्शन में सुधार के लिए?
कोडगुरू

इस उत्तर का वीडियो संस्करण (5 मिनट) youtu.be/MfE1tnMG6fE
विबिसन इंद्रावन

1
@WesleySmith 8.0.2 के रूप में laravel/laravelआप के लिए वहाँ है कि आप
असहजता

18
  • हां लार्वा 8 में यह त्रुटि होती है।
  • कई समाधानों को आज़माने के बाद मुझे ये सही समाधान मिला
  • बस चरणों का पालन करें ...

मामला एक

हम में बदल सकते हैं api.phpऔर में web.phpनीचे की तरह फाइलों ..
वर्तमान जिस तरह से हम लिखने syntaxहै

Route::get('login', 'LoginController@login');

को बदलना चाहिए

Route::get('login', [LoginController::class, 'login']);

मामला - २

  1. सबसे पहले फाइल पर जाएं: app > Providers > RouteServiceProvider.php
  2. उस फाइल में लाइन
    protected $namespace = null;को बदलेंprotected $namespace = 'App\Http\Controllers'; यहाँ छवि विवरण दर्ज करें
  3. फिर ->namespace($this->namespace)छवि में दिखाए अनुसार लाइन जोड़ें
    यहाँ छवि विवरण दर्ज करें

1
यह मेरे लिए काम कर रहा है।
श्रीकांत पारधी

@ श्रीकांतपार्डी धन्यवाद कृपया उत्थान करें यदि वास्तव में इस उत्तर से आपको मदद मिली :)
रोहित तगाडिय़ा

9

में laravel -8 डिफ़ॉल्ट निकालें नामस्थान उपसर्ग आप laravel-7 की तरह में पुराने तरीके से निर्धारित कर सकते हैं:

RouteServiceProvider.phpइस चर में जोड़ें

protected $namespace = 'App\Http\Controllers';

और अद्यतन bootविधि

public function boot()
{
       $this->configureRateLimiting();

       $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));
        });
}

6

लार्वाल 8 अपडेटेड रूट सर्विस सर्विस और यह स्ट्रिंग सिंटैक्स के साथ रूट को प्रभावित करता है, आप इसे ऊपर की तरह बदल सकते हैं, लेकिन अनुशंसित तरीका स्ट्रिंग सिंटैक्स वाले रूट सिंटैक्स का उपयोग नहीं कर रहा है:

Route::get('register', 'Api\RegisterController@register');

इसे बदल दिया जाना चाहिए:

Route::get('register', [RegisterController::class, 'register']);

5

लारवल 8 में आप मार्गों \ web.php में बस अपना नियंत्रक नामस्थान जोड़ते हैं

use App\Http\Controllers\InvoiceController; // InvoiceController is controller name Route::get('invoice',[InvoiceController::class, 'index']);

या

`app \ Providers \ RouteServiceProvider.php` पथ पर जाएं और टिप्पणियां निकालें

protected $namespace = 'App\\Http\\Controllers';


2

यदि आप लार्वा 8 का उपयोग कर रहे हैं

बस मेरे कोड को कॉपी और पेस्ट करें

use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);

1

लार्वा -8 में आप इस तरह का उपयोग कर सकते हैं

 Route::group(['namespace'=>'App\Http\Controllers', 'prefix'=>'admin',
 'as'=>'admin.','middleware'=>['auth:sanctum', 'verified']], function()
{
    Route::resource('/dashboard', 'DashboardController')->only([
        'index'
    ]);
});

धन्यवाद


1

यदि आप मूल ऑटो-उपसर्ग नियंत्रक नियंत्रक का उपयोग करना जारी रखना चाहते हैं, तो आप बस अपने नाम के अंदर $ नामस्थान संपत्ति के मूल्य को सेट कर सकते हैं।

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));
    });
}


0

यदि आप इस मार्ग का समूहीकरण करना पसंद करते हैं, तो आप निम्न कार्य कर सकते हैं:

Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
    Route::resource('user', 'UserController');
    Route::resource('book', 'BookController');
});


0

लार्वा 8 में अपने मार्गों को परिभाषित करने का तरीका या तो है

use App\Http\Controllers\HomeController;

// Using PHP callable syntax...
Route::get('/', [HomeController::class, 'index']);

या

// Using string syntax...
Route::get('/', 'App\Http\Controllers\HomeController@index');

एक संसाधन मार्ग बन जाता है

Route::resource('/', HomeController::class);

इसका मतलब यह है कि लार्वा 8 में, डिफ़ॉल्ट रूप से कोई स्वचालित नियंत्रक घोषणा उपसर्ग नहीं है।

यदि आप पुराने तरीके से चिपके रहना चाहते हैं, तो आपको एक नेमस्पेस संपत्ति जोड़ने की आवश्यकता है app\Providers\RouteServiceProvider.php(यह संपत्ति पिछले संस्करणों में मौजूद थी) और मार्गों की विधि में सक्रिय करें। नीचे इस छवि निर्देशों का पालन करें: यहाँ छवि विवरण दर्ज करें


-1

बस लाइन के नीचे से असुविधा RouteServiceProvider(यदि मौजूद नहीं है तो जोड़ें)

protected $namespace = 'App\\Http\\Controllers';

-1

Laravel 8 में जिस तरह से मार्गों को निर्दिष्ट किया गया है वह बदल गया है:

Route::resource('homes', HomeController::class)->names('home.index');

-1

मेरी यह त्रुटि थी

(प्रकाशित करें \ ठेके \ कंटेनर \ BindingResolutionException लक्ष्य वर्ग [App \ Http \ Controllers \ ControllerFileName] मौजूद नहीं है।

समाधान: बस अपने वर्ग का नाम जांचें, यह आपके फ़ाइल नाम का सटीक होना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.