Я добавил пакет корзины к моей установке Laravel, но мне нужно добавить метод в класс. Если я модифицирую класс напрямую, мои изменения будут перезаписаны при обновлении до более новой версии? Если да, то какой лучший способ для изменения пакета, не нарушая будущих обновлений?
Спасибо за помощь! -JB
Я не знаю, есть ли какой-либо общий процесс для расширения пакета Laravel 5.0 из каталога поставщика, и я уверен, что это может быть различным для разных пакетов. Но, сказав это, я столкнулся с той же проблемой, когда хотел продлить эту тележку . Но мне это удалось, и шаги, которые я последовал, ниже. Надеюсь, это может дать какой-то намек.
Установка пакета
composer require "gloudemans/shoppingcart":"~1.3"
Создайте app/Services/Cart
каталога app/Services/Cart
и новый класс MyCart
под ним
<?php namespace App\Services\Cart; use Gloudemans\Shoppingcart\Cart; class MyCart extends Cart { }
создайте 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); }); }
}
Создайте MyCartFacade
app/Services/Cart
MyCartFacade
,
<?php namespace App\Services\Cart; use Illuminate\Support\Facades\Facade; class MyCartFacade extends Facade { protected static function getFacadeAccessor() { return 'mycart'; } }
в config/app.php
добавить следующий в массив providers
'App\Providers\CartServiceProvider'
и следуя в массиве aliases
'MyCart' => 'App\Services\Cart\MyCartFacade'
Вот и все. Теперь в моем контроллере я разместил следующий код. add
и content
– это метод в базовом классе 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 ) ) ) )
Теперь, если вы хотите добавить или переопределить функциональность, просто поместите эту функцию в класс MyCart
.
Хорошо, вы можете обновить базовый пакет.
Я надеюсь, что это помогает.