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

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

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

Может есть способ сделать что-то типа кастомного ProductProxy модели, где я добавил свой метод?
  • Вопрос задан
  • 102 просмотра
Решения вопроса 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
Обычно используют Трейты. Модель немного тронуть придётся.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
от 140 000 до 170 000 ₽
Stream Telecom Санкт-Петербург
от 120 000 ₽
от 120 000 до 250 000 ₽
06 июн. 2023, в 04:00
4500 руб./за проект
06 июн. 2023, в 02:35
800 руб./в час
06 июн. 2023, в 00:15
30000 руб./за проект