Kazklesh
@Kazklesh
Учусь фронтэндить

Есть ли способ добавить свои методы не трогая модель в laravel?

Допустим, есть модель Product, которая находится в папке vendor/somepackage/models/Product и хочу добавить свой метод, но так как в vendor все файлы перезаписываются когда обновляешь пакеты, все изменения в проде тупо не останутся.

Может есть способ сделать что-то типа кастомного ProductProxy модели, где я добавил свой метод?
  • Вопрос задан
  • 109 просмотров
Решения вопроса 2
RNSNS
@RNSNS
Symfony Backend developer
На самом деле это очень легко

#src/Model/ProductProxy.php
<?php

namespace App\Model;

use ВашПакет\Product;

class ProductProxy extends Product
{
    public function newMethod(): void
    {
        echo "Hello World!";
    }
}
Ответ написан
Комментировать
gzhegow
@gzhegow
aka "ОбнимиБизнесмена"
Или так

<?php

namespace App\Model;

use ВашПакет\Product;

class ProductDecorator
{
  protected $decorated;

  public function __construct(Product $product) {
    $this->decorated = $product;
  }

  public function __call($method, $args) { return call_user_func_array([ $this->decorated, $method ], $args); }
  public function __callStatic($method, $args) { return call_user_func_array([ static::class, $method ], $args); }

  public function newMethod(): void
  {
    echo "Hello World!";
  }
}


В первом случае модель на автомате получит другую таблицу (она из имени класса делается), придется ставить protected $table = 'table_name'; а как захочешь добавить префикс в БД идти искать где префиксы вписывать ибо имена статикой. А добавишь в конфиг базы префикс - придется использовать модели в миграциях, а там в основном строки.

Во втором случае некоторые методы могут не работать из-за того что возвращают void например.

Так что:

<?php
class ProductService
{
  public function doSome(Product $product) : Product
  {
    $product->updated_at = new \DateTime('now');
    return $product;
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Sanes
@Sanes
Обычно используют Трейты. Модель немного тронуть придётся.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы