在OOP中重写整个网站,我认为这一切都错了吗?

时间:2013-05-29 19:52:03

标签: php oop smarty autoloader

到目前为止,我的所有网站都是用非常线性的代码编写的(感谢QBASIC!),这经常让我对重复,杂乱和不可操作的代码感到悲伤。每个动态页面都有自己独立的.php文件,我从未使用过函数。

我现在正在使用OOP和Smarty作为模板引擎重写整个网站,并且可以真正使用一些指导。

这是我目前的流程:

1)访客点击index.php?/ view / fluffybunny。 index.php只是网站其余部分的处理程序:

// main config holds all database, sphinx and memcached settings
// and also connects to server
require_once '../config/site.cfg.php';

$urlPath = explode('/',$_GET['path']);

$page = new page($tpl,$db);

if (!empty($urlPath[1]))
{
    switch ($urlPath[1])
    {
        case 'view': $page->view($urlPath); break;
        case 'browse': $page->browse($urlPath); break;
        case 'index': $page->index($urlPath); break;
        default: $page->index($urlPath); break;
    }
}
else
{
    header('HTTP/1.0 404 Not Found'); // then 404 because we dont want seo issues
    exit("File not found");
}

2)'new page()'然后触发自动加载器以包含page.class.php:

/* page Class
 * Created by James Napier 16/05/2013
 * Revision 0.1
 */
class page
{
    private $tpl;
    private $db;

    public function __construct($tpl='',$db='') {
        $this->tpl = $tpl;
        $this->db = $db;
    }   

    /*
    * Displays index page 
    * Depending on URL it either displays a local index or countrywide index
    */
    public function index($urlPath)
    {
        $locUrl = '';

        if (!empty($urlPath[3])) //this is the location part
        { 
            // init location class
            $location = new location($this->db);

            // check whether location exists
            if($location->checkByUrl($urlPath[3]))
            {
                $locUrl = '/in/'.$urlPath[3]; // if it does add location suffix to urls
            } 
            else
            { 
                // if it doesnt, 404 
                header('HTTP/1.0 404 Not Found');
                exit("File not found");
            }
        }

        // assign location url to template
        $this->tpl->assign('locUrl', $locUrl);

        // homepage breadcrumbs
        $this->tpl->assign('breadCrumbs',array(
            array('title'=>'Site '.COUNTRY_CODE1, 'friendlyurl'=>'/'),
            array('title'=>'Home', 'friendlyurl'=>'/')));   

        // Build the template and display it
        $this->tpl->display('index.tpl');
    }


    /*
    * Displays individual listing 
    * Uses the ID from the end of the URL to display the correct item 
    */  
    public function view($urlPath)
    {   
        $id = end($urlPath);

        if (!empty($id))
        {
            // Retrieve the article from the database along with POINT values
            $stmt = $this->db->prepare('SELECT *, X(locpoint) as x, Y(locpoint) as y FROM listing WHERE id = :id LIMIT 1');
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);
            $stmt->execute();

            if($listing = $stmt->fetch(PDO::FETCH_ASSOC))
            {
                // Deal with the article status
                if ($listing['status'] == 'deleted')
                {
                    $this->err404();
                }
                elseif ($listing['status'] == 'disabled')
                {
                    $this->tpl->assign('bannerErr','THIS AD HAS EXPIRED AND IS PENDING DELETION');
                }
                elseif ($listing['status'] == 'pending')
                {
                    $this->tpl->assign('bannerErr','THIS AD IS NOT YET ACTIVE AND IS BEING REVIEWED BY THE FLOGR TEAM');            
                }

                // Start building the basic page vars from the results
                $this->tpl->assign('itemID', $listing['id']);
                $this->tpl->assign('itemTitle',$listing['title']);
                $this->tpl->assign('itemDescription',$listing['description']);
                $this->tpl->assign('itemShortDesc',$listing['shortdesc']);

                // price
                $this->tpl->assign('itemPrice', number_format($listing['price']));
                $this->tpl->assign('itemPriceTag',$listing['pricetag']);

                // location details
                $this->tpl->assign('itemLatLng', $listing['x'].','.$listing['y']);
                $this->tpl->assign('itemLocation', $listing['loctext']);

                // contact details
                $this->tpl->assign('itemContactName',$listing['name']);
                $this->tpl->assign('itemContactNo', $listing['phone']);
                $this->tpl->assign('itemContactType', $listing['type']);

                // images
                $this->tpl->assign('itemImages', json_decode($listing['images'], true));


                // Retrieve the category info for breadcrumbs and titles
                $getContent = new getContent();

                // breadcrumbs
                $this->tpl->assign('breadCrumbs',$getContent->breadCrumbs($listing['catid'],'/browse/', $this->db));


                // Page and SEO titls
                $this->tpl->assign('headTitle',$listing['title'].' located in '.$listing['loctext'].' | site.com');
                $this->tpl->assign('headDesc', $listing['shortdesc']);

                // Build the template and display it
                $this->tpl->display('view_ad.tpl');

                // Update hits and set viewed session var
                $_SESSION['filter']['viewed'][] = $listing['id'];
                $stmt = $this->db->query('UPDATE LOW_PRIORITY listing SET hits = hits+1 WHERE id = '.$listing['id']);
            }
            else
            {
                $this->err404();
            }
        }
        else
        {
            $this->err404();
        }   
    }


    /*
    * standard 404 error 
    */  
    public function err404()
    {
        header('HTTP/1.0 404 Not Found');
        exit("File not found");
    }
}

首先我的问题是,任何人都可以看到我作为OOP的新手犯下的任何明显错误吗?

其次,无论index.php处理程序是否调用$ page-> index(),$ page-&gt,我都需要在每个页面上运行一些大的代码块(用户身份验证..等等)。 ;图()...等。我如何将此代码集成到page.class.php?

1 个答案:

答案 0 :(得分:0)

就你的代码而言,你在做OOP时做得很好但是从头开始编程框架你基本上是在重新发明轮子。我强烈建议使用像CakePHP,Zend Framework或Laravel这样的现有框架。在您使用框架一段时间之后,您开始掌握您喜欢的内容以及您不喜欢的内容。那时制作自己的框架是一个很好的练习。但即使在那一点,你应该意识到开源框架已经开发出使用100的,如果不是1000的人/小时,而每个框架可能会有你不喜欢的怪癖,处理那些怪癖是比从头构建框架容易得多。