Skip to content

Commit 49689cc

Browse files
committed
fix: rssのxmlパースエラーでシステムエラーとなる
パースエラー時に例外キャッチ
1 parent 165c266 commit 49689cc

File tree

2 files changed

+64
-15
lines changed

2 files changed

+64
-15
lines changed

app/Plugins/User/Rsses/RssesPlugin.php

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ public function index($request, $page_id, $frame_id, $errors = null)
125125
$rss = $this->getRsses($frame_id);
126126

127127
$setting_error_messages = null;
128+
$parse_errors = null;
128129
$rss_urls = new Collection();
129130
if ($rss) {
130131
$rss_urls = RssUrls::query()
@@ -156,12 +157,19 @@ public function index($request, $page_id, $frame_id, $errors = null)
156157
}
157158
// xmlレスポンスエラーの場合がある
158159
if ($xml_response) {
159-
// Connect-CMS用にパース
160-
$xmlitems = $this->xmlParse($xml_response);
161-
// 出力数を調整
162-
$xmlitems = array_splice($xmlitems, 0, $urls->item_count);
163-
// 画面様に変数にセット
164-
$urls->items = $xmlitems;
160+
try {
161+
// Connect-CMS用にパース
162+
$xmlitems = $this->xmlParse($xml_response, $urls->url);
163+
// 出力数を調整
164+
$xmlitems = array_splice($xmlitems, 0, $urls->item_count);
165+
// 画面様に変数にセット
166+
$urls->items = $xmlitems;
167+
} catch (\Exception $e) {
168+
// パースエラー時はparse_errorsに格納
169+
$urls->items = [];
170+
$parse_errors['message'] = $e->getMessage();
171+
$parse_errors['url'][] = $urls->url;
172+
}
165173
}
166174
}
167175

@@ -183,7 +191,7 @@ public function index($request, $page_id, $frame_id, $errors = null)
183191
}
184192

185193

186-
if (empty($setting_error_messages)) {
194+
if (empty($setting_error_messages) && empty($parse_errors)) {
187195
// 表示テンプレートを呼び出す。
188196
return $this->view('rsses', [
189197
'request' => $request,
@@ -197,6 +205,7 @@ public function index($request, $page_id, $frame_id, $errors = null)
197205
// エラーあり
198206
return $this->view('rsses_error_messages', [
199207
'error_messages' => $setting_error_messages,
208+
'parse_errors' => $parse_errors,
200209
]);
201210
}
202211
}
@@ -251,7 +260,29 @@ private function getXml($url)
251260
private function xmlParse($response)
252261
{
253262
// SimpleXMLを使用してXMLデータをオブジェクトに変換
254-
$xml = simplexml_load_string($response);
263+
libxml_use_internal_errors(true);
264+
try {
265+
$xml = simplexml_load_string($response);
266+
if ($xml === false) {
267+
$error_message = "simplexml_load_string error: ";
268+
foreach (libxml_get_errors() as $error) {
269+
$error_message .= $error->message . " ";
270+
}
271+
throw new \Exception(trim($error_message));
272+
}
273+
} catch (\Exception $e) {
274+
// 管理権限があるか判定
275+
$is_admin = Auth::check() && Auth::user()->can('role_article_admin');
276+
$display_message = $is_admin
277+
? 'RSSフィードの取得に失敗しました。URLが正しいか、またはフィードが有効であるかご確認ください。'
278+
: 'RSSフィードの読み込みに失敗しました。しばらくしてから再度お試しください。';
279+
// ログ出力
280+
Log::error($e->getMessage());
281+
// 画面用に例外を投げる
282+
throw new \Exception($display_message);
283+
} finally {
284+
libxml_clear_errors();
285+
}
255286

256287
// フィードのバージョンに応じてアイテムを取得
257288
if (isset($xml->channel->item)) {

resources/views/plugins/user/rsses/default/rsses_error_messages.blade.php

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,31 @@
44
@extends('core.cms_frame_base')
55

66
@section("plugin_contents_$frame->id")
7-
@can('frames.edit',[[null, null, null, $frame]])
8-
<div class="card border-danger">
9-
<div class="card-body">
10-
@foreach ($error_messages as $error_message)
11-
<p class="text-center cc_margin_bottom_0">{!! nl2br(e($error_message)) !!}</p>
12-
@endforeach
7+
{{-- xmlのパースエラー --}}
8+
@isset($parse_errors)
9+
<div class="alert alert-danger" role="alert">
10+
{{ $parse_errors['message'] }}
11+
@can('frames.edit',[[null, null, null, $frame]])
12+
@isset($parse_errors['url'])
13+
<ul>
14+
@foreach ($parse_errors['url'] as $url)
15+
<li>{{ $url }}</li>
16+
@endforeach
17+
</ul>
18+
@endisset
19+
@endcan
1320
</div>
14-
</div>
21+
@endisset
22+
{{-- 管理者専用のエラーメッセージ --}}
23+
@can('frames.edit',[[null, null, null, $frame]])
24+
@isset($error_messages)
25+
<div class="card border-danger">
26+
<div class="card-body">
27+
@foreach ($error_messages as $error_message)
28+
<p class="text-center cc_margin_bottom_0">{!! nl2br(e($error_message)) !!}</p>
29+
@endforeach
30+
</div>
31+
</div>
32+
@endisset
1533
@endcan
1634
@endsection

0 commit comments

Comments
 (0)