01/10/2018, 16:22

Tạo title cho mỗi page trong php

Chào mọi người
Cho mình hỏi một vấn đề như sau. Mình đang thiết kế 1 trang web php theo mô hình mvc và xây dựng header và footer của trang cho toàn bộ trang web dùng chung. Vấn đề của mình là title của mỗi trang sẽ khác nhau thì có cách nào giải quyết nó TỐI ƯU NHẤT
Ví dụ bằng hình ảnh của mình như sau


Mình giải quyết nó được bằng cách là trong controller thì khi gọi tới view mình sẽ tạo thêm 1 biến title để truyền vào view và trong header thì mình sẽ echo nó ra. Nhưng mình cảm thấy nó có vẻ chưa tối ưu cho lắm, vì mỗi lần gọi tới view mình sẽ lại phải tạo 1 biến title để truyền sang view như vậy có vẻ không tốt khi code (mình nghĩ thế).
Hi vọng có được giải pháp nào đó tốt từ các bạn.
Mình cảm ơn.

Hung viết 18:23 ngày 01/10/2018

Bạn tự viết MVC á. Nếu đúng thì như thế này. Lượm lặt từ hồi mình viết [spoiler]Drgnz[/spoiler] web framework. Còn nếu bạn đang dùng framework thì skip qua post mình.

Có 1 class LayoutDescriptor chứa các thông tin về layout. Interface ViewResolver lấy các thông tin từ LayoutDescriptor, default class là HtmlViewResolver trả về 1 HTML (JsonViewResolver, XMLViewResolver, FDFViewResolver,…)

<?php
class LayoutDescriptor
{
    /**
     * Đường đẫn đến file HTML
     * views/layout.view.php, views/layout/index.view.php
     */
    protected $path;

    /**
     * String trong đoạn <title>$title</title> trong thẻ <head>
     */
    protected $title;

   // setters and getters
}

Trong class Controller có 1 property là LayoutDescriptor, và có thể, thêm get và set cho tiện.

class Controller 
{
    protected $layout;

    public getLayoutDescriptor()
    {
         return this->layout;
    }

    /**
     * Optional setter
     */
    public setTitle($title)
    {
        $this->layout->setTitle($title);
    }

    /**
     * Optional getter
     */
    public getTitle()
    {
        return $this->layout->getTitle();
    }
}

Khi kế thừa Controller, thì chỉ cần gọi setter để thay đổi title trong action tương ứng.

<?php
class HomePageController extends Controller
{
    /**
     * Route: /home, /home/index
     */
    public index()
    {
        $this->setTitle('Home');
        return view();
    }
}
Chẵn viết 18:38 ngày 01/10/2018

Mình mới tìm hiểu về php nên viết thuần chứ không dùng framework, sẽ thử tìm hiểu giải pháp của bác xem sao. Bác có public source lên git hoặc biết nguồn nào cho vấn đề này, cho mình tham khảo sâu thêm nhỉ?
Cảm ơn bác.

Hung viết 18:38 ngày 01/10/2018

Framework đi kèm với công ty bạn, không public được

Chẵn viết 18:39 ngày 01/10/2018

Vậy để mình từ từ nghiên cứu giải pháp bác đưa ra xem sao, cảm ơn bác.

Bài liên quan
0