문제

많은 프레임 워크가 URL 규칙을 사용합니다 /controller/action/{id} 그것은 훌륭하지만 그 이상의 구성이 필요한 경우 자신의 경로를 작성하는 것은 귀하에게 달려 있습니다.

URL을 어떻게 처리하겠습니까? /users/{id}/friends 백엔드에? (사용자의 모든 친구를 나열하려면)

컨트롤러에서 이와 같은 것이 적절할 것이라고 생각합니다.

class User {
    function index() {
        echo 'user index';
    }
}

class Friend extends User {
    function index($user_id) {
        echo 'friend index';
    }    
}

그런 다음 다음지도가 있습니다.

/users              -> User::index()
/users/{id}         -> User::view($id)
/users/{id}/friends -> Friend::index($user_id)

나는 친구 수업을 사용자 수업에 넣고 싶었지만 분명히 PHP에서는 그렇게 할 수 없으므로 이것이 내가 생각 해낼 수있는 최선입니다. 생각?

친구 목록을 편집하기 위해 어떤 URL을 사용할 수 있습니까? /users/{id}/friends/edit 효과가있을 수 있지만 다른 사람의 친구 목록을 편집하지 않아야하기 때문에 적절하지는 않습니다. 일 것이다 /account/friends/edit 더 나은 선택이 되나요? 해당 코드를 어디에 두겠습니까? 친구 컨트롤러, 사용자 컨트롤러 또는 특수 계정 컨트롤러에서?

보너스 질문 : 어떤 것을 선호합니까? /photos/delete/{id} 또는 /photos/{id}/delete


답 :

그래서, 내가 답에서 수집 한 것은 "사물"이 복잡하지만 ( "친구"와 같은) 자체 컨트롤러가 없다면 모델없이 하나를 줄 수 있거나 그렇지 않은 경우 컨트롤러를 줄 수 있다는 것입니다. 가장 밀접하게 관련된 모든 것을 사용하십시오. URL은 코드를 넣을 위치에 영향을 미치지 않아야합니다. 대부분의 사람들은 당신이 고집해야한다고 생각하는 것 같습니다 /controller/action/{id} 사람들이 익숙한 것이기 때문에 가능합니다.

아무도 "어색한"이라고 말하는 것 외에도 확장 클래스에 대해서는 실제로 언급하지 않았습니다. 아마도 내가 그것을 분리하고 싶다면 친구 목록이 더 적절한 수업 일 것입니다.

모든 답변에 감사드립니다 :)

도움이 되었습니까?

해결책

당신이 말하는 경로 와이 구조를 달성하기 위해 서브 클래스를 사용하는 방식은 나에게 약간 어색해 보입니다. 표준 협약 /controller/action/{id} 간단한 작업에 적합하지만 복잡한 응용 프로그램을 작성하는 경우 항상 사용자 정의 경로를 만들어야합니다. 이러한 경로를 만들 때 사용할 수있는 좋은 지침이있을 수 있지만, 실제로 응용 프로그램 전체에서 일관성을 유지하고 가능한 한 간단하게 유지하는 것이 실제로 요약됩니다.

나는 그럴만 한 이유가 없다 /user/{id}/friends "매핑" "Friend"컨트롤러. 왜 그냥 가지고 있지"friends"에 대한 행동이 되십시오 User 제어 장치? 실제로 특정 친구의 페이지를보기 위해 드릴 다운하면 Friend 컨트롤러 (/friends/view/123) 또는 당신은 당신의 용도를 변경할 수 있습니다 User 친구 또는 현재 로그인 한 사용자를 위해 작동하도록 컨트롤러 (/user/view/123).

Re : 보너스 질문, 내가 고수 할 것입니다 /photos/delete/{id} (/controller/action/{id}) 그것이 가장 널리 받아 들여지는 메커니즘입니다.

다른 팁

내가 선호하는 /photos/{id}/delete. 내 추론은 URL의 끝에서 하나의 구성 요소를 가져 가면 여전히 의미가 있어야한다는 것입니다.

무엇을 가정하는 것은 매우 쉽습니다 /photos/{id} 해야 할 일 : 사진 세트보기 {id}.

그러나 무엇을해야합니다 /photos/delete 하다? 정말 불분명합니다.

나는 일종의 기본 협약이 있다는 것을 알고 있습니다. /controller/action/id, 그러나 그 조직은 컨트롤러의 클래스/메소드 아키텍처에 매핑하기위한 것입니다. 코드를 수용하기 위해 UI를 구성하는 것이 좋지 않다고 생각합니다 (URL은 UI의 일부에 있습니다).


RE 의견 : 예, /photos/{id} 어쩌면 신분증으로 주어진 사진을 보는 것이 더 합리적 일 것입니다. /users/{id}/photos 아마도 컬렉션을 볼 것입니다. 그것은 당신에게 달려 있습니다.

요점은 코드 조직 측면에서가 아니라 사용자 측면에서 UI를 생각해야한다는 것입니다.

당신은 또는 둘 중 하나를 할 수 있습니다. 문제는 둘을 섞을 때입니다. /users/{id}/friends 및/user/friends//{id} 누군가가 "친구"의 ID를 가지고있을 때 이것은 실패합니다. 이것은 사소한 경우처럼 보일 수 있지만 ID 용 사용자 이름을 사용하는 것이 매우 인기가 있습니다. 모든 작업에 대해 사용자 이름을 제한해야합니다.


때때로 당신은 할 수 없습니다 /{controller}/{action}/{id}

나는 잠시 동안 인디 음악 사이트를했고 우리는

/artist/{username}
/artist/{username}/albums
/artist/{username}/albums/{album}

우리는 조건부를 테스트하고 싶지 않아서하지 않았습니다.

/artist/{username}/{album}

우리는 "앨범"이라는 앨범을 가진 사람을 확인하고 싶지 않았기 때문에

우리는 그것을 할 수있었습니다

/artist/{username}
/artist/{username}/albums
/albums/{album}

그러나 우리는 URL에 아티스트 이름과 앨범 이름을 모두 갖는 SEO의 이점을 잃을 것입니다. 또한이 경우 우리는 앨범 이름을 독특하게 강요 할 것입니다. 아티스트가 다른 아티스트와 동일한 앨범 이름을 갖는 것이 일반적이기 때문에 나쁘게 나옵니다.

당신은 순수 할 수 있습니다 /{controller}/{action}/{id} 그러나 당신은 SEO를 잃고 URL 단축을 할 수 없습니다.

/artist/view/{username}
/artist/albums/{username}
/album/view/{album}

당신의 예로 돌아갑니다.

/user/{id}/friends/edit은 작동 할 수 있지만 다른 사람의 친구 목록을 편집해서는 안되기 때문에 적절하지 않은 것 같습니다.

이 경우해야합니다 /friends/edit 사용자 ID는 세션에서 어떻게 든 가정에서 중복 정보이므로. 일반적으로 URL 확장이 아닌 URL 단축을 지원하려고합니다.

(보너스 질문)도 사용하지도 않습니다 쉬다. DELETE /photo?id={id}

또한 데이터를 저장하는 방법에 따라 다릅니다. 어떤 경우에는 당신이 당신의 모델의 엔티티가 되려면 '친구 목록'이 필요하다고 생각할 수 있습니다. 그런 다음 논리적 접근 방식은 기본 키인 각 친구 목록에 대한 고유 식별자를 지정하는 것입니다.

편집하거나 삭제하기 위해 친구 목록의 기본 키 만 필요하기 때문에 논리적으로 다음 경로가 발생합니다.

/friends/edit/{friendListId}

결정하는 것은 당신에게 달려 있습니다. PIX0R이 언급 한 바와 같이 : 소규모 응용 프로그램에 대한 협약입니다 /{controller}/{action}/{id} 여기서 {id}는 대부분의 웹 사이트 작업과 일치하는 선택 사항이어야합니다. 경우에 따라 응용 프로그램이 커지고 3 개 이상의 요소가있는 특정 경로를 정의하려고합니다. 경우에 따라 특정 엔터티는 더 큰 의미를 얻습니다 (위의 예).이를 위해 사용자 정의 컨트롤러를 정의하기로 결정할 수 있습니다 (기본 경로를 다시 완벽하게 만듭니다 ...).

기본 경로를 고수했습니다 /controller/action/id 그러나 처음에는 친구와 같은 모든 것을위한 컨트롤러를 만들지 마십시오. Model-View-Controller 패턴을 사용하면 매우 쉽게 나중에 경로를 변경하십시오, 모든 경로 링크와 동작 (양식 등)이 경로와 동작에 따라 생성되는 한. 그래서 당신은 정말로 그렇게 귀찮게 할 필요가 없습니다 :)

URL 자체는 실제로는 중요하지 않습니다. 더 중요한 것은 각 컨트롤러의 내용입니다. 당신의 예에서 당신은 당신의 친구 목록이 연장되었습니다. User 수업. 친구 목록이 실제로 사용자 목록이라면 아마도 확장해야합니다. Users 한 곳에서 사용자 목록을 처리하도록 컨트롤러.

class Users {

    public function index() {
        $users = $this->findUsers();
    }

    protected function findUsers($userId=null) { ... }
}

class Friends extends Users {

    public function index($userId) {
        $users = $this->findUsers($userId);
    }
}

어떤 클래스를 확장 해야하는지 알아내는 데 어려움이 있다면 각 클래스에서 필요한 것을 작성하고 가장 긴 목록을 가진 클래스를 선택하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top