লারাভেলের রিসোর্স কন্ট্রোলারে নতুন পদ্ধতি যুক্ত করুন


141

আমি জানতে চাই যে লারাভেলের কোনও রিসোর্স কন্ট্রোলারে নতুন পদ্ধতি যুক্ত করা সম্ভব এবং আপনি এটি কীভাবে করেন।

আমি জানি যে এই পদ্ধতিগুলি ডিফল্ট (সূচক, তৈরি, সঞ্চয়, সম্পাদনা, আপডেট, ধ্বংস)। এখন আমি একই নিয়ামকটিতে অতিরিক্ত পদ্ধতি এবং রুট যুক্ত করতে চাই।

এটা কি সম্ভব?

উত্তর:


261

আপনার উত্সটি নিবন্ধ করার আগে কেবল পৃথকভাবে সেই পদ্ধতিতে একটি রুট যুক্ত করুন :

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

7
মনে রাখবেন যে আপনার নতুন পদ্ধতিগুলি অন্যথায় উপরে যেতে হবে ::resourceঅন্যথায় আপনি একটি ত্রুটি বার্তা পেয়েছেন, "মডেলের জন্য কোনও প্রশ্নের ফলাফল নেই"।
এমপেন

আপনি কীভাবে {id} এর মতো একটি প্যারামিটারটি পাস করবেন? বর্তমানে আমি আমার কাস্টম পদ্ধতিটি রুট.এফপিতে ইনলাইন কোডিং করেছি (উদাহরণস্বরূপ এখানে লারাভেল ডকসস / ৫.১ / ট্রাউটিং টুআউট-প্যারামিটার )। আদর্শভাবে আমি FooController এ চালানোর জন্য প্যারামিটারটি পাস করতে চাই।
এটিউটারমে

1
সমস্যাটি খুঁজে পেয়েছে - রুট সিনট্যাক্সে ছিল না। আসলে কিছু কাস্টম মিডলওয়্যার ছিল যা আমি ব্যবহার করছি! রুট :: পান ('foo / {id} / বার', 'FooController @ বার'); আইডিটি বার ($ আইডি) পদ্ধতিতে পাস করবে। ধন্যবাদ!
এটিউটরমে

কেউ কি ব্যাখ্যা করতে পারেন কেন কাস্টম রুটটি সংস্থান রুটের উপরে যেতে হবে ??? আমি কিছু পরীক্ষা করেছি এবং মনে হয় উপরে বা নীচে রাখার মধ্যে কোনও দ্বিধা নেই ...
রিকার্ডো ভিগাত্তি

3
@RicardoVigatti - সংস্থান এই রুট খাতাপত্র: Route::get('foo/{id}', ...)। এটি fooসহ একটি অতিরিক্ত বিভাগ সহ শুরু হওয়া এবং থাকা সমস্ত রুটকে গ্রাস করে foo/bar
জোসেফ সিলবার

32

আমি জেটটি "মুছুন" পদ্ধতিটি যুক্ত করতে কেবল এটি করেছি।

আপনার ফাইলগুলি তৈরি করার পরে, আপনাকে কেবল যুক্ত করতে হবে

'AntonioRibeiro\Routing\ExtendedRouterServiceProvider',

আপনার অ্যাপ্লিকেশন / config.php- এ 'সরবরাহকারী'

এই একই ফাইলে রুট ওরফে সম্পাদনা করুন:

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

এটি পরিবর্তন

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

এবং নিশ্চিত করুন যে এই ফাইলগুলি স্বয়ংক্রিয়ভাবে চালিত হচ্ছে, সেগুলি অবশ্যই আপনার রচনাশক্তি জেসন ("অটোল্যাড" বিভাগ) এর কিছু ডিরেক্টরিতে থাকতে হবে।

তারপরে আপনার কেবল দরকার:

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 এবং উপরে জন্য একই সরবরাহ করতে পারেন? আমি এটি পুনরুত্পাদন করার চেষ্টা করছি ... তবে ধারকটিতে তারা 'রুট' অ্যাকসেসরটি কোথায় নিবন্ধভুক্ত করছে তা খুঁজে পাচ্ছি না।
টিপুজায়ানসুলতান

ফাইলটির এক্সটেনশন কেন? পাস?
থিয়াগো ডায়াস

22

হ্যাঁ, এটা সম্ভব ..

আমার ক্ষেত্রে আমি পদ্ধতি যুক্ত করি: এইচটিটিপি পোস্ট পদ্ধতিতে / ডেটা.জসনের জন্য অনুরোধটি পরিচালনা করতে ডেটা।

এই আমি কি।

প্রথমে আমরা নতুন পদ্ধতির ডেটা যুক্ত করতে আলোকসজ্জা out রাউটিং \ রিসোর্স-রেজিস্টার প্রসারিত করি

<?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);
    }
}

তারপরে আপনার নতুন সার্ভিসপ্রোভাইডার তৈরি করুন বা এর পরিবর্তে অ্যাপসোসেসরিভাইডার ব্যবহার করুন।

পদ্ধতি বুটে , এই কোডটি যুক্ত করুন:

    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 এবং আপনি নতুন পদ্ধতি 'ডেটা' পাবেন


আপনার সমাধানটি আমার পক্ষে কাজ করে .. আপনি এই কোডটি ব্যবহার করে কয়েক মাস পরে কোনও সমস্যা আবিষ্কার করে থাকলে আমাকে বলতে পারবেন?
রিকার্ডো ভিগাটি

ধন্যবাদ @ রিকার্ডোভিগাটি। আমি লারাভেল ৫.২ থেকে এটি ব্যবহার করেছি এবং এখন আমি আমার সাম্প্রতিক প্রকল্পে এটি L5.3 এর সাথে ব্যবহার করছি এবং এটি নিয়ে কোনও সমস্যা নেই। আপনার যদি একটি থাকে তবে আমাকে জানান, হতে পারি আমি আপনাকে সাহায্য করতে পারি ..
মোখামাদ রোফি'উদ্দিন

সুন্দর, আমি এটি আমার 5.0 প্রকল্পে বাস্তবায়ন করছি। সমাধানটি খুব সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে তবে কোনও সমস্যা যদি আসে তবে তা কয়েক সপ্তাহ পরে হবে।
রিকার্ডো ভিগাত্তি

@ মোখামাদআরফিউদ্দিন আমি আপনার সমাধানটি প্রয়োগ করেছি, নতুন রুটটি রুটের তালিকায় যুক্ত করা হয়েছে তবে মনে হয় এটি সম্পর্কিত পদ্ধতি যুক্ত করা হয়নি। আমি কিছু অনুপস্থিত করছি ?
শিয়াভোষ

@ সিভোশ কেবলমাত্র আপনার পদ্ধতিটি কন্ট্রোলারে লিখুন অর্থাত আমি পদ্ধতির ডেটা যুক্ত করি (): `পাবলিক ফাংশন ডেটা (অনুরোধ $ অনুরোধ) {}`
মোখামাদ রোফি'উদ্দিন

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

এটি ব্যবহার করে দেখুন .আপনার অতিরিক্ত পদ্ধতি যেমন গেটডাটা () ইত্যাদি রাখুন .. এটি আমার জন্য রুট.এফপি পরিষ্কার রাখতে কাজ করেছে


ইয়াস এটি কাজ করে। লারাভেল 5.1 ডকুমেন্টেশনে উল্লেখ করা হয়নি যে রুট :: রিসোর্স এবং রুট :: কন্ট্রোলার একসাথে ব্যবহার করা যেতে পারে বরং তারা সম্পূরক রিসোর্স কন্ট্রোলার সম্পর্কে উল্লেখ করেছেন। সুতরাং এটি বিভ্রান্ত। তবে আপনার উত্তরগুলি প্রমাণ করেছে যে এগুলি একসাথে ব্যবহার করা যেতে পারে
আমির

আমি দুঃখিত হাসান জামাল, এই দুজন একসঙ্গে কাজ করছেন না। আমি এখন কেবল রুট :: রিসোর্স ব্যবহার করলে কীভাবে আমি একটি নিয়ামকটিতে একটি কাস্টম পোস্ট পদ্ধতি সেট করতে পারি
আমির

3

লারাভেল> 5 ব্যবহার করে রুট ফোল্ডারে ওয়েব.এফপিপি ফাইলটি সন্ধান করুন আপনার পদ্ধতিগুলি যুক্ত করুন

এই সমস্ত পদ্ধতি সূচক, প্রদর্শন, সঞ্চয়, আপডেট, আপনার নিয়ামককে এক লাইনে ধ্বংস করতে আপনি রুট :: সংস্থান ব্যবহার করতে পারেন

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
এটি বাস্তব কোডের গন্ধের মতো অনুভব করে। আমি চাইনি আমার কন্ট্রোলাররা একাধিক ক্রিয়া পরিচালনা করছে।
রনিকনক্সভিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.