Немного о symfony с doctrine под Linux

    Начиная изучать symfony, первым делом посмотрел статьи на хабре. Есть переводы, в которых рассказано как сделать свой проект на symfony, где за основу взят sandbox. Мне интересно было разобраться, как установить и настроить symfony + doctrine имея только исходник фреймворка. Проект мне предстоит делать большой, поэтому в этой статье расскажу с чем мне удалось познакомиться.


    0 шаг: Общее


    "/home/nutt/workspace/htdocs" — папка где будет лежать проект и куда смотрит apache.

    1 шаг: Установка


    Загружаем и распаковываем исходник в папку с проектом
    /home/nutt/workspace/htdocs

    После этого переходим непосредственно в папку и создаем проект. После выполнения команды, symfony создаст все необходимые папки.
    nutt@nutt:~/workspace/htdocs$ sudo ./data/bin/symfony generate:project test

    Я разрабатываю проект в ubuntu на VirtualBox, поэтому следующий корректив возможно вам не понадобиться. Для того чтобы было видно develop-панель (http://localhost/frontend_dev.php/) нужно подправить в:
    ~/workspace/htdocs/web/frontend_dev.php
         
        if(!in_array(@$_SERVER['REMOTE_ADDR'], array('[ваш IP], '::80')))


    Далее нужно настроить apache (/etc/apache2/sites-enabled/000-default):
    <VirtualHost [ваш IP]:80>
     ServerName nutt.com
     DocumentRoot /home/nutt/workspace/htdocs/web

            php_admin_value register_globals Off

     RewriteLog "/var/log/apache2/mod_rewrite.log"
     RewriteLogLevel 2
     Alias /sf /home/nutt/workspace/htdocs/data/web/sf
     <Directory /home/nutt/workspace/htdocs/web>
        Options Indexes FollowSymLinks MultiViews ExecCGI
        Options All
        AllowOverride All
        Order allow,deny
        Allow from all
     </Directory>
    </VirtualHost>


    2 шаг: Doctrine


    По-умолчанию в symfony используется Propel. Мне для моего проекта нужно было переключиться на Doctrine (sfDoctrinePlugin). Для этого
    нужно отредактировать файл ProjectConfiguration.class.php в ~/workspace/htdocs/config

    Было:
    public function setup()
     {
        $this->enablePlugins(array('sfDoctrinePlugin'));
        $this->disablePlugins(array('sfPropelPlugin'));
     }
    Стало:
     public function setup()
     {
         $this->enablePlugins(array('sfDoctrinePlugin'));
     }


    Удалить из конфига Propel:
     nutt@nutt:~/workspace/htdocs/config$ sudo rm propel.ini
     nutt@nutt:~/workspace/htdocs/config$ sudo rm schema.yml


    Добавить соединение для doctrine:
     nutt@nutt:~/workspace/htdocs$ sudo ./data/bin/symfony configure:database --name=doctrine --class=sfDoctrineDatabase "mysql:host=localhost;dbname=test" root root


    3 шаг: Создаем таблицы с помощью Doctrine



    Отредактируем файл schema.yml в ~/workspace/htdocs/config/doctrine/schema.yml
        users:
         columns:
            name: { type: string(255), notnull: true, unique: true }


    Генерируем классы:
    nutt@nutt:~/workspace/htdocs$ ./data/bin/symfony doctrine:build-model


    Строим запросы SQL:
    nutt@nutt:~/workspace/htdocs$ ./data/bin/symfony doctrine:build-sql


    Выполняем SQL:
    nutt@nutt:~/workspace/htdocs$ ./data/bin/symfony doctrine:insert-sql


    Вопросы:


    1. Имеется таблица с тремя внешними ключами на один ID. В Doctrine я описал их следующим образом:
      1. relations:
      2.     Tblaccount:
      3.      foreignAlias: tbltransaction
      4.      local: intinaccountid
      5.      foreign: intaccountid
      6.      type: one
      7.      foreignType: many
      8.     Tblaccount:
      9.      foreignAlias: tbltransaction
      10.      local: intoutaccountid
      11.      foreign: intaccountid
      12.      type: one
      13.      foreignType: many
      14.     Tblaccount:
      15.      foreignAlias: tbltransaction
      16.      local: intfeeaccountid
      17.      foreign: intaccountid
      18.      type: one
      19.      foreignType: many


      После doctrine:build-sql в SQL генерируется только последняя связь:
      1. ALTER TABLE tbltransaction ADD FOREIGN KEY (intfeeaccountid) REFERENCES tblaccount(intaccountid);

      Как сделать чтобы были созданы все внешние ключи?

    2. У меня весь проект и сам symfony лежит в одной папке. Правильно ли это? Как вы располагаете проект?

    Спасибо.

    P.S.


    Давольно долго жду последнего голоса на получения инвайта для друга. Буду благодарен.

    Комментарии 17

      0
      1. Назвать их по-разному. У вас они все одинаковые :)
      2. Ну если у Вас один проект, то ничего страшного. но если много и постоянно обновляете из SVN — один удобнее.

      Кстати, а зачем на Хабре перепечатка мануала с сайта Симфони?
        0
        Мануал читаю, но перепечатывать не собирался… Видно так получилось… А так вообще очень доволен фреймворком.

        Пробывал именить «foreignAlias: tbltransaction»->«foreignAlias: tbltransaction1» и «Tblaccount:»->«Tblaccount1:». В первом случае так же создается один FK, во втором ничего. Что в именно нужно изменить в имени?
          0
          foreignAlias — это название foreign модели. У Вас проблема в том, что все связи имеют одинаковые названия (именно сами связи) — Tblaccount, Tblaccount, Tblaccount. Вот к ним и добавляйте постфиксы 1,2,3
            0
            relations:
            Tblaccount1:
            foreignAlias: tbltransaction
            local: intinaccountid
            foreign: intaccountid
            type: one
            foreignType: many
            Tblaccount2:
            foreignAlias: tbltransaction
            local: intoutaccountid
            foreign: intaccountid
            type: one
            foreignType: many
            Tblaccount3:
            foreignAlias: tbltransaction
            local: intfeeaccountid
            foreign: intaccountid
            type: one
            foreignType: many
              0
              Пробывал. В таком случае вообще не создается FK. =(
              0
              foreignAlias указывает, как будет называться ссылка на текущую модель в той, на которую ссылаемся.
                0
                Я это и имел в виду. Извиняюсь за косоязычность :-)
              +1
              В вашем случае класс нужно указывать явно (по всей видимости). Также было бы неплохо получить описание отношений словами, а не в виде схемы.
              relations:
                  IntInAccount:
                   class:  Tblaccount
                   foreignAlias: tbltransaction
                   local: intinaccountid
                   foreign: intaccountid
                   type: one
                   foreignType: many
                  IntOutaccount:
                   class:  Tblaccount
                   foreignAlias: tbltransaction
                   local: intoutaccountid
                   foreign: intaccountid
                   type: one
                   foreignType: many
                  IntFeeAccount:
                   class:  Tblaccount
                   foreignAlias: tbltransaction
                   local: intfeeaccountid
                   foreign: intaccountid
                   type: one
                   foreignType: many

              а зачем везде указывать foreignAlias: tbltransaction?
                0
                Я только учусь… Приду домой, попробую что вы написали. Если получиться, то не зра получил 2-а минуса =)
                  0
                  Ничего страшного, сам не так давно был в аналогичной ситуации. Насилу разобрался, что зачем.
                  0
                  Спасибо за совет! Все получилось!
                    0
                    Извините за занудство, но всё же. Вы понимаете назначение параметра foreignAlias?
                      0
                      не совсем.
                        +1
                        Я так и подумал. foreignAlias — название отношения в foreign модели. То есть, дёрнув $account-><что_там_написано_в_foreignAlias>, мы получим Doctrine_Collection, состоящую из элементов описываемого класса.
                        В вашем случае отношениям к одному и тому же классу (tblAccount) присвоены одинаковые foreignAlias (tbltransaction). По всей видимости, Doctrine не ругается на эти извращения, но тем не менее это нонсенс — обращаться к разным коллекциям по одному псевдониму. В общем, рекомендую заглянуть в базовые классы как это модели, так и тех, на которые ссылаетесь — очень познавательно :)
                          0
                          Спасибо за подробный ответ.
                +2
                Я держу symfony в PEAR. И обновляю там же.
                Далее нужно настроить apache (/etc/apache2/sites-enabled/000-default)
                1. У меня в /etc/apache2/sites-available лежит выключенный конфиг symfony-default аналогичного содержания, который я по мере необходимости копирую и правлю. Потому что
                2. Сайт default править не совсем правильно — он переписывается при каждом апгрейде апача. Приходится мергать руками, а интерфейс для этого неудобен; в общем, так проще. И да, почитайте man a2ensite и a2dissite
                  0
                  Спасибо за совет.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое