代码之家  ›  专栏  ›  技术社区  ›  Frank

在控制器和url的动作部分之后使用if-else语句根据参数加载视图是否有效,或者有更好的方法吗

  •  0
  • Frank  · 技术社区  · 7 年前

    我可以有以下URL

    www.example.com/accounts/
    www.example.com/accounts/signup
    www.example.com/accounts/signup/validate
    www.example.com/accounts/login
    

    指数

    $url_segments = explode('/', $url);
    
    $controller = !empty($url_segments[0]) ? $url_segments[0] : 'home';
    array_shift($url_segments); // removes the controller name from array
    $action = isset($url_segments[0]) && !empty($url_segments[0]) ? $url_segments[0] : 'index';
    array_shift($url_segments); // removes the action name from array
    
    $controller = ucfirst($controller);
    $controller = new $controller($url_segments);
    $controller->$action();
    

    控制器类

    class Accounts{
        private $url_segments;
    
        public function __construct() {
            $this->url_segments = $url_segments;
        }
        public function index() {
            // index code here
        }
        public function login() {
            // login code here
        }
        public function signup() {
            if (!isset($this->url_segments[0])) { 
                // url entered was: example.com/signup
            } else if (isset($this->url_segments[0]) && $this->url_segments[0] == 'validate') {
                // url entered was: example.com/signup/validate
            }
        }
    }
    

    /signup/ signup/validate . 这种使用条件语句加载基于参数的视图的方法有效吗?或者有更好的方法吗。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Tekk    7 年前

    我建议你使用这样的路由系统 Symfony Routing . 在那里,您可以为每个url添加一个新路由,并将其重定向到您的特定控制器。 示例路线:

    $routes = new RouteCollection();
    
    $routes->add('/accounts_signup', route('POST', "/accounts/signup", 'App\Controller\AccountController:signup'));
    
    return $routes;
    

    这条路线将呼叫 signup 当www.example时,AccountController Cals中的方法。com/accounts/signup收到post请求。

    我建议你用这样的东西。即使一开始这可能有点复杂,在阅读(并理解)文档后,这将为您节省大量时间,并使您的代码更具可读性。