Přeskočit na hlavní obsah

How to override (hack) location directories eg. Model in Zend Framework projects

Content

At beginning

This approach is bad but it is trivial and works. First I thought about a way how to inject/override by my implementation but if I stood before "I need only change location where objects will be generated..."

Use Case

For example - your project's 'models' directory has different structure and you must remove each generated model's php file to your specific directory.

Standart directory layout

If you use command "zf create model ItemModel". ItemModel file will be generated by default in directory 'models'.

----models
  |--DbTable
  |--ItemModel.php

Specific directory layout

We want to generate model class in subdirectory 'Domain'. That's all.
----models
  |--DbTable
  |--Domain
    |--ItemModel.php

Solvetion

We must find directory '%ZF_HOME%\library\Zend\Tool\Project\Context\Zf\'. There are lot of sources which define how to generate/utilizing project's entities. We look for ModelsDirectory.php and replace location in $_filesystemName attribute (default 'models') by 'models/Domain'.

class Zend_Tool_Project_Context_Zf_ModelsDirectory extends Zend_Tool_Project_Context_Filesystem_Directory
{

    /**
     * @var string
     */
    protected $_filesystemName = 'models/Domain';

    /**
     * getName()
     *
     * @return string
     */
    public function getName()
    {
        return 'ModelsDirectory';
    }

}

Next you must change filename mask in order to be correctly generated. You must find entity file.... ModelFile.php and there is method getContents. Now we can generate model entities in Domain subdirectory with correct name - %APP_NAME%_Model_Domain_%FILE_NAME%

class Zend_Tool_Project_Context_Zf_ModelFile extends Zend_Tool_Project_Context_Zf_AbstractClassFile
{

    public function getContents()
    {

        $className = $this->getFullClassName($this->_modelName, 'Model_Domain');

        $codeGenFile = new Zend_CodeGenerator_Php_File(array(
            'fileName' => $this->getPath(),
            'classes' => array(
                new Zend_CodeGenerator_Php_Class(array(
                    'name' => $className,
                    ))
                )
            ));
        return $codeGenFile->generate();
    }

}

Summary

If I checked .zfproject.xml I didn't find any problem because xml doesn't describe real filesystem structure. XML file is not concrete and don't depend at location where item (model, controller, action) will be generated .

As I said it is not clear way but it is so simply that I didn't want to invest much time to find solvetion and used this hack.

Komentáře

Populární příspěvky z tohoto blogu

Zend framework - jak vytvořit modul

Úvod V příspěvku se zmíním o způsobu, jak vytvořit modul v Zend Frameworku. Dále si povíme o jeho registraci v projektu a namapování zdrojů, které bude daný modul používat. Architektura projektu Jak vytvořit modul Namapování adresářové struktury modulu Shrnutí Závěr Případné problémy Zdroje Jednu poznámku hned na začátku, seznam proměnných, které budu používat v textu: %APACHE_HOME% - adresář, v kterém máte nainstalován httpd server %APP_HOME% znamená %APACHE_HOME%/htdocs/zendapp/application , jedná se o lokaci aplikace, na které budu vysvětlovat tento návod Architektura projektu Adresářová struktura ZF projektu hraje klíčovou roli. Základní stavební jednotkou projektu je modul . Základní struktura aplikace, kterou získáváte stažením Zend Frameworku je považována za defaultní modul. Nicméně při implementaci větších projektů se setkáte s tím, že projekt je potřeba rozdělit na několik logických celků (administrace, blog, fotogalerie atd.). ZF nabízí architektům mod...

Nevytvářejte společného předka pro Zend_Controller_Action používejte Zend_Controller_Plugin

Je žádoucí mít jednu implementaci opakující se funkcionality na jednom místě a tu reusovat. Narazil jsem však při vytváření společného předka pro Zend_Controller_Action na jeden problém. Když vytvořím předka pro své controllery, pak nelze použít Zend_Tool pro generování akcí. Nastavení prostředí V projektu mám tuto hiearchii: |--library |--MyLibrary |--Controller |--Action |--Action.php Výše uvedenou knihovnu mám pak zaregistrovanou v Bootstrap.php souboru, potažmo namespace, aby ji Zend_Autoloader našel. Kod.1 public function _initLibraryNamespace(){ $loader = Zend_Loader_Autoloader::getInstance(); $loader->registerNamespace('MyLibrary_'); } Nyní vytvořím pomocí Zend_Tool controller v defaultním modulu. Na problém se však narazil i u controlleru, který byl v modulu. zf create controller Item 1 Nyní změním předka na svou implementaci controlleru. Kod.2 /** * @author...