4

APIコール

http://localhost:8888/api/v1/users/100 //doesn't exist

HTML 呼び出し

http://localhost:8888/admin/users/100 //doesn't exist

明らかに、Html Call 例外が json データを返すことは望ましくなく、Api Call が Html データを返すことも望ましくありません。

私はコントローラーでの例外処理ではありません。UserRepository で例外処理を行っています。そのため、コントローラーはユーザー リポジトリから結果を返すだけです。

class Sentry2UserRepository implements UserInterface {
public function findById($id) {
    try {
        return Sentry::findUserById($id);
    }
    catch (\Cartalyst\Sentry\Users\UserNotFoundException $e) {
    // Do something here
    return false;
        }
}
}

質問 1: エラーをコントローラーに戻して、何を表示すればよいかを知る通常/適切な方法は何ですか?

質問 2: 例外/エラー用の標準の json API 形式はありますか?

質問 3: Web UI が内部 JsonApi を使用することは適切な方法ですか? それとも、WebUi コントローラーで Api と同じリポジトリをクエリすることで、現時点で正しい方法で処理を行っていますか?

4

2 に答える 2

4

あなたのfilters.phpでこの魔法を試してみてください:

App::error(function(Exception $exception, $httpCode)
{
    if (Request::is('api/*')){
         return Response::json( ['code' => $exception->getCode(), 'error' => $exception->getMessage()], $httpCode );
    }else{
         $layout = View::make('layouts.main');
         $layout->content = View::make('errors.error')->with('code', $exception->getCode())->with('error', $exception->getMessage())->with('httpCode',$httpCode);
         return Response::make($layout, $httpCode);
    }
});
于 2014-09-16T10:12:50.797 に答える
0

まず、あなたのアプローチSentry2UserRepositoryは悪くないと思います。大丈夫ですIMO

質問 1: エラーをコントローラーに戻して、何を表示すればよいかを知る通常/適切な方法は何ですか?

まあ、IMO、アプリケーションに応じて、例外を処理する方法を決定する必要があります。あなたは言及so that it will know what to displayしましたが、この場合、例外が発生した後に次のアクションを実行するために例外から必要な情報と方法によって異なります。エラーメッセージが必要な場合は、を返すことができるreturn $e->getMessage()ので、実際に何が起こったのかを正確に知ることができます. これを行うには多くの方法があります。たとえば、単一の を使用しcatchます。

try{
    // ...
}
catch( Exception $e )
{
    if ($e instanceof UserNotFoundException) {
        // it's an instance of UserNotFoundException, return accordingly
    }
    elseif ($e instanceof SomethinElseException) {
        // it's an instance of SomethinElseException, return accordingly
    }
}

また、さまざまなカスタム例外クラスを使用でき、複数のcatchブロックを使用できます。

class AnException extends Exception 
{
    public function customErrorMessage() 
    {
        return `AnException occurred!`
    }
}

class AnotherException extends Exception 
{
    public function customErrorMessage() 
    {
        return `AnotherException occurred!`
    }
}

catch次に、複数のブロックを使用してキャッチします。

try 
{
    // ...
}

catch(AnException $e) 
{
    return $e->customErrorMessage();
}

catch(AnotherException $e) 
{
    return $e->customErrorMessage();
}
catch(Exception $e)
{
    return $e->getMessage();
}

質問 2: 例外/エラー用の標準の json API 形式はありますか?

質問 3: Web UI が内部 JsonApi を使用することは適切な方法ですか? それとも、WebUi コントローラーで Api と同じリポジトリをクエリすることで、現時点で正しい方法で処理を行っていますか?

実際、私はそのようなことについて知りませんapi。あなたは正しくやっています、IMO。それは、あなたがこれを持っているからです

class Sentry2UserRepository implements UserInterface {
    public function findById($id) {
        try {
            return Sentry::findUserById($id);
        }
        catch (\Cartalyst\Sentry\Users\UserNotFoundException $e) {
            // Do something here
            return false;
        }
    }
}

したがって、コントローラーに次のようなコードを書くことができます

if(findById(5)) {
    // found and dump it to the view
}
else {
    // show "Not Found !", false will be back only for UserNotFoundException 
}

しかし、あなたがこれをあなたのUserNotFoundExceptionキャッチに持っていたら

return $e; // or anything else (maybe an array containing status and message)

次に、この単純なコードを書くことはできません

if(findById(5)) {
    // found and dump it to the view
}

配列のオブジェクト oe に対してis ステートメントが true になるため、$eこのような somrthing を使用して、もう一度確認する必要があります。

$result = findById(5);
if($result && $result->code && $result->code === 0) {
    // something according to code
}

または多分、このようなもの

if($result && $result->code) {
    // error happened, now determine the code
    switch($result->code){
        case 0:
        // show message
        break;

        case 1:
        // show message
        break;
    }
}

それで、IMO、なぜ、アプリケーションでどのエラーが発生したのか、データを取得したか取得しなかったかを示すだけでなく、ユーザーに表示する必要があります。シンプルじゃない?キスするだけ。これはあくまで私の意見です、それだけです。

于 2013-10-01T03:14:08.293 に答える