Паттерн Фабрика реализацияя через __callStatic

Тугай

Новичок
Все же прав Зандстра в своей книжке и fixxxer, тип должен задаваться в url'e или в явном виде как параметр запроса.
Я бы и фабрику написал не динамически, а явно и да правил бы ее руками в случае нового метода. Не вижу тут каких-то проблем.

keltanas
Твой код создает лишние объекты, которые кушают память и некогда не используются. Да они маленькие проблем нет, но сам подход не оптимальный.
И тот же вопрос: 2) Что ты будешь делать, если внезапно появятся два сервиса, возвращающие абсолютно идентичный набор параметров?
 

keltanas

marty cats
Тугай
Да писец. Тебе придется увеличить память, доступную скрипту на 10кб.

Я ничего делать не буду. Я все уже написал. Сначала авторизуется первый сервис. Если не получилось, тогда второй.
Ну или сам провайдер может реферал проверять или какие-то прочие особенности.
 

WMix

герр M:)ller
Партнер клуба
Сначала авторизуется первый сервис. Если не получилось, тогда второй.
это каким образом? типа а вдруг это был фэйсбук?
я понял создание всех обьектов авторизации как, только для вызова метода "дай_линк_на_авторизацию"
 

keltanas

marty cats
WMix
В этом и прикол. Что мы опять обсуждаем какую-то сферическую задачу. Я еще ни разу за все 3 страницы не видел, как он собирается это использовать :)
 

Вурдалак

Продвинутый новичок
keltanas, твой вариант, конечно, имеет право на жизнь, но его можно сравнить с определением типа файла по содержимому — это не вполне корректно, тип должен быть известен заранее (по расширению).
 

keltanas

marty cats
Вурдалак
Мой вариант легко упрощается до вида:
PHP:
    public static function factoryByRequest(Request $Request) {
         // $fbListener
         if ($Request->has('fb_id')) {
            return static::factory('Facebook', $Request);
         }
         // $vkListener
         if ($Request->has('vk_id')) {
            return static::factory('Vkontakte', $Request);
         }
         ...
         return false;
    }
с той разницей, что реализован через обсервер и позволяет легко (в виде плагинов) добавлять новые методы аутентификации.
 

Вурдалак

Продвинутый новичок
keltanas, да не суть, я про то, что такой подход не совсем корректен изначально.
 

WMix

герр M:)ller
Партнер клуба
PHP:
 // не проверял, но идея такая

interface AuthStrategy{
     public function exec($cfg,$post);
}

class Auth implements AuthStrategy{
    public function exec($cfg,$post){
       if (isset($post['adapter'])  ){
           if ( isset($cfg[$post['adapter']] ){ 
              $className = $post['adapter'].'Auth';
               if (class_exists($className) && is_subclass_of( $className, 'AuthStrategy')) {
                  return {new $className()}->exec( $cfg[$post['adapter']], $post);
               }
           }
       }
       throw new Exception();
    }
}

class FacebookAuth implements AuthStrategy{
    public function exec($cfg,$post){
    // ...
    }
}
$cfg = array('Facebook' => array(...));
{new Auth()}->exec($cfg,$post);
 
Сверху