Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php DRY:如何避免代码重复?_Php_Design Patterns_Zend Framework_Dry - Fatal编程技术网

Php DRY:如何避免代码重复?

Php DRY:如何避免代码重复?,php,design-patterns,zend-framework,dry,Php,Design Patterns,Zend Framework,Dry,好的,我的问题来了,我有一个这样的方案数据库 +-------------+ +------------+ +-----------+ + Object + + car + + computer + +-------------+ +------------+ +-----------+ + id + + object_id + + object_id + + some_col + + max_speed + + CPU_speed + +

好的,我的问题来了,我有一个这样的方案数据库

+-------------+ +------------+ +-----------+ 
+ Object      + + car        + + computer  +
+-------------+ +------------+ +-----------+
+ id          + + object_id  + + object_id +
+ some_col    + + max_speed  + + CPU_speed +
+ type        + + n_gears    + + memory    +
+-------------+ +------------+ +-----------+
因此,总结一下,当我的用户输入一台计算机时,例如,我创建了一个对象记录,将所有共享字段保存到其中,并创建了一个计算机记录,其中包含保存的计算机的所有特定数据

到目前为止还不错,我的问题来了,如果这样做,我将不得不复制每一个动作(以及每种类型对象的控制器方法视图)。所以现在在我的控制器中,我有这些动作:

  + new-car
  + new-computer
  + show-car
  + show-computer
  + edit-car
  + edit-computer
  + list-car
  + list-computer
因此,对于每种类型,我基本上复制了所有代码并更改了几行代码(即用计算机映射器替换汽车映射器,记录对象也是如此)。我必须提到您使用zend框架并使用PHP编写的应用程序


我想做更多的事情“不要重复你自己”,而不必重复所有的代码。您知道如何更优雅地使用它吗?

您必须创建一个元表,其中包含关于每种类型对象的信息,即它有哪些字段、如何显示每种字段(例如输入或选择)、它们的顺序等等


然后,您可以访问主控制器,只需将对象名传递给它,然后它就会生成相应的CRUD表单。

您必须创建一个元表,其中包含关于每种类型对象的信息,即它有哪些字段、如何显示每种字段(例如输入或选择)、它们的顺序等等


然后您可以访问主控制器,只需将对象名传递给它,然后它就会生成相应的CRUD表单。

我将与您共享我的基本CRUD类。按原样供应。自己测试一下。有些bug可能是;)


我将与您分享我的基本CRUD类。按原样供应。自己测试一下。有些bug可能是;)


我做了一些类似于汤姆·亚什·费法尔的事

创建一个基本CRUD控制器和一个包含CRUD方法的基本模型类。您甚至可以使用适用于基本CRUD模板的所有内容类型的通用视图脚本


在每个控制器中,您所需要的只是顶部的一些变量,以便进行必要的修改。

我做了一些类似于TomášFejfar的事情

创建一个基本CRUD控制器和一个包含CRUD方法的基本模型类。您甚至可以使用适用于基本CRUD模板的所有内容类型的通用视图脚本


在每个控制器中,您所需要的只是顶部的几个变量,以便进行任何必要的更改。

{new,show,edit,list}-object,其中对象由环境(如目录路径)确定,或者您将其作为method@AJreal这些都是控制器动作,我想知道,实际上我是否最好为我的控制器创建一个私有方法,并尝试使用PHP magics创建某种模板函数,即$className='Application\u Model\ux'$对象类型$o=新的$className();{new,show,edit,list}-object,其中对象由环境(如目录路径)确定,或者将其作为method@AJreal这些都是控制器动作,我想知道,实际上我是否最好为我的控制器创建一个私有方法,并尝试使用PHP magics创建某种模板函数,即$className='Application\u Model\ux'$对象类型$o=新的$className();因此,您有一些私有方法,并在操作中使用它们。例如,私有函数列表($object类型)。在你的行动中,你做了$this->_list(“car”);我说的对吗?是的,这是一个有效的模式。
\u list
方法将获取显示和绘制项目列表所需的列的信息。因此,您有一些私有方法,可以在操作中使用它们。例如,私有函数列表($object类型)。在你的行动中,你做了$this->_list(“car”);我说的对吗?是的,这是一个有效的模式。
\u list
方法将获取显示和绘制项目列表所需的列的信息。谁用非英语编写方法名称?@ravelen,谁以问题的形式提问?为学术环境(这是我学士学位论文的一部分)编写课程的人,他们认为使用母语是好的。我不这么认为,但我无意在期末考试时改变这些长期以来的习惯:做得好,想想看,对于母语为英语的人来说,url看起来更可读(就像它在英语/admin/function/delete中所做的那样-啊,我正在删除一个函数:))谁用非英语写方法名?@ravelen,谁会把陈述作为问题来提问呢?一个为学术环境(这是我学士学位论文的一部分)写课程的人,他们认为使用母语是好的。我不这么认为,但我并没有打算在期末考试时改变这些长期以来的习惯:做得好,想想看,对于母语为英语的人来说,url看起来更可读(就像在英语/admin/function/delete中一样-啊,我正在删除一个函数:)
<?php
abstract class Controller_Crud extends Controller 
{
/* definované v dalších třídách */
protected $_viewKey = '';
protected $_url = 'admin/';
protected $_modelClass;
protected $_formClass;
protected $_filterFormClass = null;
protected $_title = 'Untitled';

/* pro vnitřní potřebu */
protected $_model;
protected $_form;
protected $_filterForm;
private $_defaultViewKey = 'crud';

/* 
 * Inicializace třídy, vytvoření instancí modelů a formulářů
 * @see Tul/Controller/Tul_Controller_Admin#init()
 */
public function init()
{
    parent::init();
    $this->_model = new $this->_modelClass();
    $this->_form = new $this->_formClass();
    $this->view->indexUrl = $this->_url;
    $this->view->viewKey = $this->_viewKey;
    $this->view->title = $this->_title;
}

public function postDispatch()
{
    // Po provedení akce je nastaven titlek
    $this->view->headTitle($this->_title);
}
/**
 * základní akce zabezpečující výpis záznamů a filtrování
 * @return void
 */
public function indexAction ()
{
    if(null !== $this->_filterFormClass){
        $this->_filterForm = new $this->_filterFormClass;
    }
    $filter = null;
    if(null !== $this->_filterFormClass){
        if($this->_getParam('filter') && $this->_filterForm->isValid($this->_getAllParams())){
            $filter = $this->_filterForm->getValues();
        }
        $this->_filterForm->populate($this->_getAllParams());

    }
    /* @var Tul_Paginator */
    $paginator = $this->_model->getAllPaginator($filter);
    $paginator->setCurrentPageNumber($this->_getParam('page',1));
    $this->view->data = $paginator;
    $this->view->form = $this->_filterForm;
}

/* 
 * Načte ID záznamu a pokud není nalezeno přesměruje s chybovou hláškou na hlavní stránku
 * @see Tul/Controller/Tul_Controller_Admin#getId()
 */
public function getId()
{
    $id = $this->_getParam('id', false);
    if(false === $id){
        $this->addFlashMessage('error','Neplatné ID.');
        $this->_gotoUrl($this->_url);
    }
    return $id;
}

/**
 * akce pro přidání nového záznamu
 * @return void
 */
public function pridatAction ()
{
    $this->view->headTitle('Přidat');
    if ($this->_request->isPost()) {
        if ($this->_form->isValid($_POST)) {
            $data = $this->_form->getValues();
            try {
                $this->_beforeAdd($data);
                $result = $this->_model->insert($data);
                $this->_afterAdd($data, $result);
                $this->addFlashMessage('success','Úspěšně přidáno. ');
            } catch (Exception $e){
                $this->addFlashMessage('error','Došlo k chybě při přidávání:<br />' . htmlspecialchars($e->getMessage()));
            }
            $this->_gotoUrl($this->_url);
        } else {
            $this->_form->populate($_POST);
        }
    }
    $this->view->form = $this->_form;
    $this->_renderView('pridat.phtml');
} 

/**
 * Akce pro smazání záznamu
 * @return void
 */
public function smazatAction ()
{
    $id = $this->getId();
    try{
        $this->_beforeDelete($id);
        $result = $this->_model->delete($this->_model->quoteInto('id = ?',$id));
        $this->_afterDelete($id, $result);
        $this->addFlashMessage('success','Úspěšně smazáno. ');
    } catch (Exception $e){
        $this->addFlashMessage('error','Došlo k chybě při mazání:<br />'.htmlspecialchars($e->getMessage()));
    }
    $this->_gotoUrl($this->_url);
} 

/**
 * akce pro úpravu záznamu
 * @return void
 */
public function upravitAction ()
{
    $this->view->headTitle('Upravit');
    $id = $this->getId();
    $item = $this->_model->getById($id);
    if ($this->_request->isPost()) {
        if ($this->_form->isValid($_POST)) {
            $data = $this->_form->getValues();
            try {
                $this->_beforeUpdate($data, $item);
                $result = $this->_model->update($data, $this->_model->quoteInto('id = ?',$id));
                $this->_afterUpdate($data, $result);
                $this->addFlashMessage('success','Úspěšně upraveno. ');
            } catch (Exception $e){
                $this->addFlashMessage('error','Došlo k chybě při úpravě:<br />'.htmlspecialchars($e->getMessage()));
            }
            $this->_gotoUrl($this->_url);
        } else {
            $this->_form->populate($_POST);
        }
    } else {
        $this->_form->populate((array)$item);
    }
    $this->view->form = $this->_form;
    $this->_renderView('upravit.phtml');
}

/**
 * Pokud existuje načte pohled zděděné třídy, pokud neexistuje použije interní
 * @param $name string název pohledu
 * @return void
 */
private function _renderView($name)
{
    $completeName = $this->_viewKey . '/' . $name;
    /* @var Zend_View_Abstract */
    foreach ($this->view->getScriptPaths() as $dir) {
        if (is_readable($dir . $completeName)) {
            return $this->renderScript($completeName);
        }
    }
    return $this->renderScript($this->_defaultViewKey . '/' . $name);
}

/**
 * Metoda, která je zavolaná těsně před přidáním záznamu. 
 * Umožňuje upravit data podle potřeby před vložením do databáze. 
 * Vyhozením vyjímky přidání záznamu skončí chybou
 * @param $data array data, která budou přidána
 * @return void
 */
protected function _beforeAdd(&$data){}
/**
 * Metoda, která je zavolaná těsně po přidání záznamu. 
 * Umožňuje upravit data podle potřeby ještě po vložení do databáze. 
 * Vyhozením vyjímky přidání záznamu skončí chybou
 * @param $data array data, která budou přidána
 * @param $result mixed primární klíč přidaného záznamu
 * @return void
 */
protected function _afterAdd(&$data, $result){}
/**
 * Metoda, která je zavolaná těsně před úpravou záznamu. 
 * Umožňuje upravit data podle potřeby ještě před úpravou v databázi. 
 * Vyhozením vyjímky uprava záznamu skončí chybou
 * @param $data array data, která budou upravena
 * @param $item mixed původní data
 * @return void
 */
protected function _beforeUpdate(&$data,$item){}
/**
 * Metoda, která je zavolaná těsně po úpravě záznamu. 
 * Umožňuje upravit data podle potřeby po úpravě v databázi. 
 * Vyhozením vyjímky uprava záznamu skončí chybou
 * @param $data array data, která budou upravena
 * @param $result integer počet ovlivněných záznamů
 * @return void
 */
protected function _afterUpdate(&$data,$result){}
/**
 * Metoda, která je zavolána před smazáním záznamu. 
 * Vyhozením vyjímky smazání záznamu skončí chybou
 * @param $id id mazaného záznamu
 * @return void
 */
protected function _beforeDelete($id){}
/**
 * Metoda, která je zavolána po smazání záznamu. 
 * Vyhozením vyjímky smazání záznamu skončí chybou
 * @param $id id mazaného záznamu
 * @param $result počet smazaných řádků
 * @return void
 */
protected function _afterDelete($id, $result){}

}
<?php
class FunkceController extends Controller_Crud
{
    protected $_url = '/admin/funkce/';
    protected $_modelClass = 'Admin_Functions';
    protected $_formClass = 'Form_Admin_Functions';
    protected $_filterFormClass = 'Form_Admin_FilterFunctions';
    protected $_viewKey = 'funkce';
    protected $_title = 'Funkce';
}