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

Letmý pohled na php frameworky Zend, CakePHP a Prado

Tento článek vyšel původně na blogu derhaa.com, který jsem však zrušil. Abstrakt Tento článek je předvojem seriálu o Zend Framework (u) – dále je tu velmi stručný rozbor,  jak sem nahlédl pod pokličku dalších dvou frameworků –  CakePHP (CP) a Prado (PD).  Mimochodem se zde stručně dozvíme jak frameworky pracují a soupis funkčností, kterými se od sebe odlišují. Cílem článku je povrchně seznámit čtenáře se třemi PHP frameworky, které se staly předmětem mého zájmu – v čem napsat středně veliký projekt.   Idea Když jsem přemýšlel v čem napíšu svůj první větší počin, tj. aplikace typu HRMS , jehož dalším cílem bude nad shromážděnými daty provádět specifické analýzy/statistiky související se sportovní tématikou. Předpokládal jsem, že to nebude malý projekt, který lze napsat na koleni, ale budu potřebovat sofistikovanější nástroje pro práci s databází ( ORM ),  propracovanější návrh doménového modelu , následné rozdělení aplikace na logické celky – vrstvy ...

Zend_Tool - Cannot redeclare class Zend_Loader

V mém případě, když jsem zadal následující příkaz: zf create module admin V konsoli se objevila následujicí hláška Cannot redeclare class Zend_Loader in path/to/library/Zend/Loader on line 31 Řešení je jednochuché - Nakopírujte soubory zf.bat a zf.php z adresáře %ZEND_FRAMEWORK_DIR%/bin do adresáře %PHP_HOME% . V případě, že chcete vědět více – mkrněte na oficiální dokumentaci Zend_Tool .

PHP a Zend Framework autoloading

Úvod V příspěvku se zmíním o způsobu a správě „importů“ (tzv. autoloading) php souborů v samotném PHP a poté se dozvíme, jak autoloading php souborů řeší Zend Framework. Autoloading v PHP Správa importů v PHP Jak "importovat" v PHP soubory Jak funguje mechanismus importů v PHP Autoloading v Zend Framework Autoloading v PHP Základem při psaní aplikací v PHP je nutné si uvědomit, jak funguje tzv. autoloading php souborů. V PHP neexistují importy jako je známe např. z Java. Když například potřebujete konstruhovat třídu jejíž definice je v jiném souboru – je nutné si tento soubor za pomocí konstrukce require nebo require_once ( include , include_once ) “naimportovat“ do svého souboru (předpokladem, je že soubory jsou umístěné na include_path ). Dalším řešením je překrýt funkci autoload . Správa importů v PHP Správa “importů” souborů v php mi přijde neštastná. Jedná se do jisté míry o problém, alespoň pro mne – jsem vývojářem v Java , kde tento mechanismus je zajišt...