लारवेल में एक संसाधन नियंत्रक में नए तरीके जोड़ें


141

मैं जानना चाहता हूं कि क्या लारवेल में एक संसाधन नियंत्रक के लिए नए तरीकों को जोड़ना संभव है और आप इसे कैसे करते हैं।

मुझे पता है कि ये विधियां डिफ़ॉल्ट हैं (इंडेक्स, क्रिएट, स्टोर, एडिट, अपडेट, नष्ट)। अब मैं अतिरिक्त विधियों और मार्गों को एक ही नियंत्रक में जोड़ना चाहता हूं।

क्या यह संभव है?

जवाबों:


261

संसाधन को पंजीकृत करने से पहले अलग से उस विधि में एक मार्ग जोड़ें :

Route::get('foo/bar', 'FooController@bar');
Route::resource('foo', 'FooController');

7
नोट अपने नए तरीकों जाना है कि इसके बाद के संस्करण::resource अन्यथा आपको एक त्रुटि संदेश, "मॉडल के लिए कोई क्वेरी परिणाम" मिलता है।
मपेन

आप {id} जैसे पैरामीटर को कैसे पारित करेंगे? वर्तमान में मैंने अपने कस्टम मेथड इनलाइन को मार्गों में कोडित कर दिया है। एफपी (उदाहरण के तौर पर यहाँ लार्वेल इन / डॉक्स / 5.1/rout#route-parameters )। आदर्श रूप से मैं FooController में चलाने के लिए पैरामीटर पास करना चाहूंगा।
ATutorMe

1
समस्या मिली - रूट सिंटैक्स में नहीं थी। वास्तव में कुछ कस्टम मिडलवेयर का उपयोग कर रहा था जो मैं उपयोग कर रहा हूं! मार्ग :: प्राप्त ('फू / {आईडी} / बार', 'फूकोट्रॉलर @ बार'); आईडी को बार ($ आईडी) विधि से पारित करेंगे। धन्यवाद!
ATutorMe

क्या कोई समझा सकता है कि कस्टम मार्ग को संसाधन मार्ग से ऊपर क्यों जाना चाहिए ??? मैंने कुछ परीक्षण किए हैं और लगता है कि ऊपर या नीचे डालने के बीच कोई
भिन्नता नहीं है

3
@RicardoVigatti - संसाधन इस मार्ग को पंजीकृत करता है Route::get('foo/{id}', ...):। यह उन सभी मार्गों को निगल लेता है foo, जिनमें एक अतिरिक्त सेगमेंट होता है, जिसमें शामिल हैं foo/bar
जोसेफ सिल्बर

32

मैंने बस यही किया, एक GET "डिलीट" विधि जोड़ने के लिए।

अपनी फ़ाइलें बनाने के बाद, आपको बस जोड़ना होगा

'AntonioRibeiro\Routing\ExtendedRouterServiceProvider',

अपने ऐप / config.php में 'प्रोवाइडर्स' के लिए

इसी फ़ाइल में रूट उपनाम संपादित करें:

'Route'           => 'Illuminate\Support\Facades\Route',

इसे बदल रहा है

'Route'           => 'AntonioRibeiro\Facades\ExtendedRouteFacade',

और सुनिश्चित करें कि उन फाइलों को ऑटोलॉज किया जा रहा है, उन्हें कुछ निर्देशिका में होना चाहिए जो आपके कंपोजर में है ।json ("ऑटोलॉड" अनुभाग)।

फिर आपको बस इसकी आवश्यकता है:

Route::resource('users', 'UsersController');

और यह (अंतिम पंक्ति को देखें) यदि आप चलाते हैं तो यह परिणाम है php artisan routes:

मार्गों की सूची वे मेरे स्रोत फ़ाइलें हैं:

ExtendedRouteFacade.pas

<?php namespace AntonioRibeiro\Facades;

use Illuminate\Support\Facades\Facade as IlluminateFacade;

class ExtendedRouteFacade extends IlluminateFacade {

    /**
     * Determine if the current route matches a given name.
     *
     * @param  string  $name
     * @return bool
     */
    public static function is($name)
    {
        return static::$app['router']->currentRouteNamed($name);
    }

    /**
     * Determine if the current route uses a given controller action.
     *
     * @param  string  $action
     * @return bool
     */
    public static function uses($action)
    {
        return static::$app['router']->currentRouteUses($action);
    }

    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'router'; }

}

ExtendedRouter.pas

<?php namespace AntonioRibeiro\Routing;

class ExtendedRouter extends \Illuminate\Routing\Router {

    protected $resourceDefaults = array('index', 'create', 'store', 'show', 'edit', 'update', 'destroy', 'delete');

    /**
     * Add the show method for a resourceful route.
     *
     * @param  string  $name
     * @param  string  $base
     * @param  string  $controller
     * @return void
     */
    protected function addResourceDelete($name, $base, $controller)
    {
        $uri = $this->getResourceUri($name).'/{'.$base.'}/destroy';

        return $this->get($uri, $this->getResourceAction($name, $controller, 'delete'));
    }

}

ExtendedRouteServiceProvider.pas

<?php namespace AntonioRibeiro\Routing;

use Illuminate\Support\ServiceProvider;

class ExtendedRouterServiceProvider extends ServiceProvider {

    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app['router'] = $this->app->share(function() { return new ExtendedRouter($this->app); });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return array('router');
    }

}

3
क्या आप लारवेल 5 और उससे अधिक के लिए समान प्रदान कर सकते हैं? मैं इसे पुन: उत्पन्न करने की कोशिश कर रहा हूं ... लेकिन मुझे यह पता नहीं लग सकता है कि वे कंटेनर में 'मार्ग' एक्सेसर को कहां पंजीकृत कर रहे हैं।
टीपूजयन्नसुल्तान

फ़ाइल में एक्सटेंशन .pas क्यों है?
थियागो डायस

22

हाँ, यह संभव है ..

मेरे मामले में, मैं विधि जोड़ता हूं: HTTP POST विधि में /data.json के लिए अनुरोध को संभालने के लिए डेटा।

यह मैंने क्या किया।

पहले हम नई विधि डेटा जोड़ने के लिए Illuminate \ Routing \ ResourceRegistrar का विस्तार करते हैं

<?php

namespace App\MyCustom\Routing;

use Illuminate\Routing\ResourceRegistrar as OriginalRegistrar;

class ResourceRegistrar extends OriginalRegistrar
{
    // add data to the array
    /**
     * The default actions for a resourceful controller.
     *
     * @var array
     */
    protected $resourceDefaults = ['index', 'create', 'store', 'show', 'edit', 'update', 'destroy', 'data'];


    /**
     * Add the data method for a resourceful route.
     *
     * @param  string  $name
     * @param  string  $base
     * @param  string  $controller
     * @param  array   $options
     * @return \Illuminate\Routing\Route
     */
    protected function addResourceData($name, $base, $controller, $options)
    {
        $uri = $this->getResourceUri($name).'/data.json';

        $action = $this->getResourceAction($name, $controller, 'data', $options);

        return $this->router->post($uri, $action);
    }
}

उसके बाद, अपना नया ServiceProvider बनाएं या इसके बजाय AppServiceProvider का उपयोग करें ।

विधि बूट में , यह कोड जोड़ें:

    public function boot()
    {
        $registrar = new \App\MyCustom\Routing\ResourceRegistrar($this->app['router']);

        $this->app->bind('Illuminate\Routing\ResourceRegistrar', function () use ($registrar) {
            return $registrar;
        });
    }

फिर :

अपने मार्ग में जोड़ें:

Route::resource('test', 'TestController');

द्वारा जांचें php artisan route:list और आपको नई विधि 'डेटा' मिलेगी


आपका समाधान मेरे लिए काम करता है .. क्या आप मुझे बता सकते हैं कि क्या आपने इस कोड का उपयोग करने के कुछ महीनों बाद कोई मुद्दा खोज लिया है?
रिकार्डो विगत्ती

धन्यवाद @RicardoVigatti मैंने लार्वा 5.2 के बाद से इसका उपयोग किया है और अब मैं L5.3 के साथ अपनी हालिया परियोजना में इसका उपयोग करता हूं और इसके साथ कोई समस्या नहीं है। मुझे पता है कि अगर आपके पास एक है, तो हो सकता है कि मैं आपकी मदद कर
सकूं

अच्छा, मैं अपने 5.0 परियोजना में इसे लागू कर रहा हूँ। समाधान बहुत सुसंगत लगता है, लेकिन, यदि कोई मुद्दा पारित होने के लिए आता है, तो यह कुछ हफ्तों के बाद होगा।
रिकार्डो विगत्ती

@ MokhamadRofi'udin मैंने आपका समाधान लागू कर दिया है, नए रूट को रूट सूची में जोड़ दिया गया है लेकिन ऐसा लगता है कि संबंधित विधि नहीं जोड़ी गई है। क्या मैं कुछ भूल रहा हूँ ?
सियावोश

@ सियावॉश सिर्फ कंट्रोलर में अपना तरीका लिखता है अर्थात मैं मेथड डेटा () जोड़ता हूं: `पब्लिक फंक्शन डेटा (रिक्वेस्ट $ रिक्वेस्ट) {}`
मोखमद रोफी'औडिन

13
Route::resource('foo', 'FooController');
Route::controller('foo', 'FooController');

इसे आज़माएं। लेकिन आप अतिरिक्त तरीके जैसे गेटडाटा () आदि आदि। यह मेरे लिए मार्ग रखने के लिए काम करते हैं।


यस यह काम करता है। लारवेल 5.1 प्रलेखन ने यह उल्लेख नहीं किया कि रूट :: संसाधन और रूट :: नियंत्रक का उपयोग एक साथ किया जा सकता है, बल्कि उन्होंने संसाधन नियंत्रक के पूरक के बारे में उल्लेख किया है। तो यह उलझन है। लेकिन आपकी अनु ने साबित किया कि ये एक साथ इस्तेमाल किए जा सकते हैं
अमीर

मुझे खेद है हसन जमाल, ये दोनों एक साथ काम नहीं कर रहे हैं। तो अब मैं एक नियंत्रक में एक कस्टम पोस्ट विधि कैसे सेट कर सकता हूं अगर मैं केवल रूट का उपयोग करता हूं :: संसाधन
अमीर

3

Laravel> 5 का उपयोग करके मार्गों में web.php फ़ाइल खोजें अपने तरीकों को जोड़ें

आप इन सभी विधियों को अनुक्रमित करने, दिखाने, स्टोर करने, अपडेट करने, एक लाइन में अपने नियंत्रक में नष्ट करने के लिए मार्ग :: संसाधन का उपयोग कर सकते हैं

Route::get('foo/bar', 'NameController@bar');
Route::resource('foo', 'NameController');

1

बस एक नई विधि और उस विधि के लिए एक मार्ग जोड़ें।

आपके नियंत्रक में:

public function foo($bar=“default”)
{
      //do stuff
}

और अपने वेब मार्गों में

Route::get(“foo/{$bar}”, MyController@foo”);

बस सुनिश्चित करें कि नियंत्रक में विधि सार्वजनिक है।


-1

यह बहुत अच्छा काम करता है। इस तरह संसाधन नियंत्रक के शो विधि का उपयोग करने के लिए अधिक मार्गों को जोड़ने की आवश्यकता नहीं है:

public function show($name){

 switch ($name){
   case 'foo':
    $this -> foo();
    break;
   case 'bar':
    $this ->bar();
    break; 
  defautlt:
    abort(404,'bad request');
    break;
 }

}
public function foo(){}
publcc function bar(){}

मैं कस्टम त्रुटि पृष्ठ को फेंकने के लिए डिफ़ॉल्ट का उपयोग करता हूं।


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