Laravel扩展包类

时间:2015-01-21 20:35:25

标签: php laravel-4

我在Laravel安装中添加了一个购物车包,但我需要在课程中添加一个方法。如果我直接修改类,当我更新到更新的版本时,我的更改是否会被覆盖?如果是这样,在不破坏未来更新的情况下,修改包的最佳方法是什么?

感谢您的帮助! -JB

1 个答案:

答案 0 :(得分:10)

我不知道是否有任何一般流程可以从供应商目录扩展Laravel 5.0软件包,我相信不同的软件包可能会有所不同。但是说,当我想扩展这个cart时,我遇到了同样的问题。但我以某种方式管理它,我遵循的步骤如下。我希望它可以给出一些暗示。

  1. 安装包

    composer require "gloudemans/shoppingcart":"~1.3"
    
  2. 在其下创建目录app/Services/Cart和新类MyCart

    <?php
    
    namespace App\Services\Cart;
    
    use Gloudemans\Shoppingcart\Cart;
    
    class MyCart extends Cart
    {
    
    }
    
  3. CartServiceProvider目录下创建app/Providers

    <?php namespace App\Providers;
    
     use App\Services\Cart\MyCart;
     use Illuminate\Support\ServiceProvider;
    
    class CartServiceProvider extends ServiceProvider {
    
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    
    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app['mycart'] = $this->app->share(function($app)
        {
            $session = $app['session'];
            $events = $app['events'];
            return new MyCart($session, $events);
        });
    }
    

    }

  4. MyCartFacade目录下创建app/Services/Cart

    <?php
    
    namespace App\Services\Cart;
    
    use Illuminate\Support\Facades\Facade;
    
    class MyCartFacade extends Facade {
        protected static function getFacadeAccessor() { return 'mycart'; }
    }
    
  5. config/app.php中添加以下providers数组

    中的
  6. 'App\Providers\CartServiceProvider'
    

    并在aliases数组

    中跟随
    'MyCart'      => 'App\Services\Cart\MyCartFacade'
    

    那就是它。现在在我的控制器中我放置了以下代码。 addcontent是基础Cart类中的方法。

    \MyCart::add('293ad', 'Product 1', 1, 9.99, array('size' => 'large'));
    echo '<pre>';
    print_r(\MyCart::content());
    exit();
    

    以下是输出,

    Gloudemans\Shoppingcart\CartCollection Object
    (
        [items:protected] => Array
            (
                [0f6524cc3c576d484150599b3682251c] => Gloudemans\Shoppingcart\CartRowCollection Object
                    (
                        [associatedModel:protected] => 
                        [associatedModelNamespace:protected] => 
                        [items:protected] => Array
                            (
                                [rowid] => 0f6524cc3c576d484150599b3682251c
                                [id] => 293ad
                                [name] => Product 1
                                [qty] => 1
                                [price] => 9.99
                                [options] => Gloudemans\Shoppingcart\CartRowOptionsCollection Object
                                    (
                                         [items:protected] => Array
                                            (
                                                [size] => large
                                            )
    
                                    )
    
                                [subtotal] => 9.99
                            )
    
                    )
    
            )
    
    )
    
  7. 现在,如果您想添加或覆盖功能,只需将该功能放入MyCart类。

    好消息是,您可以更新基础包。

    我希望它有所帮助。