URISpec.php 1.54 KB
<?php

namespace RESTful;

class URISpec
{
    public $collection_uri = null,
           $name,
           $idNames,
           $override;

    # $override supercedes $name when creating an object, only necessary when
    # name and class are not equal
    public function __construct($name, $idNames, $root = null, $override = null)
    {
        $this->name = $name;
        if ($override != null) {
            $this->override = $override;
        }

        if (!is_array($idNames)) {
            $idNames = array($idNames);
        }
        $this->idNames = $idNames;
        if ($root != null) {
            if ($root == '' || substr($root, -1) == '/') {
                $this->collection_uri = $root . $name;
            } else {
                $this->collection_uri = $root . '/' . $name;
            }
        }
    }

    public function match($uri)
    {
        $parts = explode('/', rtrim($uri, "/"));

        // collection
        if ($parts[count($parts) - 1] == $this->name) {

            return array(
                'collection' => true,
            );
        }

        // non-member
        if (count($parts) < count($this->idNames) + 1 ||
            $parts[count($parts) - 1 - count($this->idNames)] != $this->name
        ) {
            return null;
        }

        // member
        $ids = array_combine(
            $this->idNames,
            array_slice($parts, -count($this->idNames))
        );
        $result = array(
            'collection' => false,
            'ids'        => $ids,
        );

        return $result;
    }
}