添加新的方法,以在Laravel资源控制器

问题描述 投票:113回答:7

我想知道是否有可能增加新的方法在Laravel资源控制器,以及如何做到这一点。

我知道,这些方法是默认(索引,创建,存储,编辑,更新,销毁)。现在,我想更多的方法和路线添加到同一个控制器。

那可能吗?

laravel
7个回答
228
投票

只是路由添加到该方法分开,你注册资源之前:

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

31
投票

我只是做的是,添加一个GET“删除”方法。

创建文件后,您只需要添加

'AntonioRibeiro\Routing\ExtendedRouterServiceProvider',

在您的应用程序/ config.php文件“供应商”

编辑同一个文件的路径别名:

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

将其更改为

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

并确保这些文件被自动加载,他们必须在某个目录您在composer.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');
    }

}

16
投票

是啊,这是可能的..

在我来说,我补充方法:数据处理在HTTP POST方法/data.json请求。

这是我做了什么。

首先,我们扩展照亮\路由\ 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检查,你会发现新的方法,“数据”


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

这给一个尝试。把你额外的方法类似的getData()等等等等。这为我工作,以保持清洁route.php


1
投票

使用Laravel> 5查找路由web.php文件夹添加你的方法

您可以使用路线::资源路由所有这些方法的指标,显示,存储,升级,破坏你的控制器在一条线

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

0
投票

这工作也相当不错。无需增加更多的航线只需要使用这样的资源控制器的显示方法:

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(){}

我使用默认抛出自定义错误页。


-1
投票

刚加入新方法和该方法的路线。

在你的控制器:

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

而在你的网络的路由

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

只要确保在控制器的方法是公开的。

© www.soinside.com 2019 - 2024. All rights reserved.