PHP ООП: хранить методы в базе данных

Я новичок в ООП, так что, пожалуйста, помилуй ;( . Я даже не уверен, что заголовок этого поста в порядке.

Я просматриваю некоторые сайты с помощью Goutte, например

$ad['title'] = $crawler->filter('#subject')->text();
$ad['image'] = $crawler->filter('.images')->filter('meta')->eq(0)->attr('content');

Это не так уж сложно, но я хочу иметь многоразовый код. Итак, для каждого сайта, который я очищаю, есть $ad['title'] и $ad['image']. Используемые методы $crawler различаются для каждого сайта, поэтому я хотел бы иметь что-то вроде

$crawler->$filter

Где фильтр содержит

'filter('#subject')->text()'

Таким образом, я могу хранить фильтры в базе данных для каждого сайта. Я не знаю, возможно ли это, даже если это хороший подход.


person Harmstra    schedule 26.02.2016    source источник
comment
ИМХО, хранение кода в базе данных ужасно затрудняет его обслуживание. Никакой IDE, никакого контроля версий, ничего.   -  person Álvaro González    schedule 27.02.2016
comment
Не соглашайся. Это намного проще, чем: запустить редактор->перейти к проекту->редактировать-> git commit-> git push и git pull. Это то, что у меня есть прямо сейчас, но слишком сложно поддерживать.   -  person Harmstra    schedule 27.02.2016
comment
Ну, всегда есть eval() ;-)   -  person Álvaro González    schedule 27.02.2016


Ответы (1)


Один из способов решить вашу проблему — использовать ООП используется концепция">полиморфизма. Для PHP это объясняется здесь и в вашем case можно использовать так (значительно упрощенно):

Определите абстрактный класс для ваших поисковых роботов. Каждый сканер должен реализовать его расширение и предоставить собственную реализацию. Конечно, класс сканера встроит объект $crawler.

abstract class BaseCrawler
{
    protected $crawler;

    abstract protected function getTitleElement();
    abstract protected function getImageElement();

    // initialize the crawler etc.
}

class CrawlerOne extends BaseCrawler
{
    public function getTitleElement()
    {
        // get the title for crawler one
    }

    public function getImageElement()
    {
        // get the image for crawler one
    }

    // other functionality may come here
}

class CrawlerTwo extends BaseCrawler
{
    public function getTitleElement()
    {
        // get the title for crawler two
    }

    public function getImageElement()
    {
        // get the image for crawler two
    }

    // other functionality may come here
}

Итак, ваша структура гибкая, но имеет общий функционал.

База данных предназначена для хранения данных, а не логики. Таким образом, если заголовок и изображение можно получить с помощью простого регулярного выражения, это можно сохранить в базе данных для каждого поискового робота. В этом случае каждый сканер может определить постоянный код, который можно использовать для поиска регулярных выражений заголовка и изображения.

person Alexei - check Codidact    schedule 27.02.2016
comment
Но это именно то, что я пытаюсь предотвратить. Если у меня 10 или даже 100 разных сайтов, мне приходится создавать кучу классов. Я хочу иметь 1 класс с универсальными методами getTitle($filter) с последовательностью фильтров в качестве аргумента. Фильтр хранится в базе данных, поэтому я могу поддерживать их с помощью формы где-то на странице администратора. - person Harmstra; 27.02.2016
comment
Если синтаксический анализ сайта основан только на одном дискриминанте (например, нескольких регулярных выражениях), вы можете определить только класс, который будет извлекать регулярные выражения из базы данных и выполнять синтаксический анализ. В противном случае хранение и динамическое выполнение кода вызывает проблемы (например, отладка, сложность внесения изменений при изменении структуры сайта и т. д.). - person Alexei - check Codidact; 27.02.2016
comment
Если алгоритм парсинга более сложен, наличие отдельного класса для каждого сайта не должно быть проблемой. Если каждый выполняет свой конкретный синтаксический анализ, вы не повторяетесь (DRY), и обслуживание простое: любое изменение в синтаксическом анализе сайта не влияет на другой синтаксический анализ (меньше риска), более легкая отладка и т. д. - person Alexei - check Codidact; 27.02.2016