php – Laravel – 自訂 404 回傳 JSON

Laravel 5.7 預設會回傳 404 的 view。如果我們製作 API 希望回傳的是 JSON 格式的 404,那麼參考以下修改。

app\Exceptions\Handler.php

public function render($request, Exception $exception)
{
    if ($this->isHttpException($exception))
    {
        if ($exception->getStatusCode() == 404)
        {
            return response(json_encode(['error' => 'Not found.']), 404)
                ->header('Content-Type', 'application/json');
        }
    }
    return parent::render($request, $exception);
}

參考

 

php – Laravel – 透過 Gmail 發送 E-mail 信件

參考官方章節

.env 設定檔

關於使用 Gmail 的設定,可以注意這篇我提到的:在 PHP 中使用 Gmail SMTP 無法驗證的方法。透過這篇步驟,我們理當能取得下方 SMTP 的各個資訊包含密碼,我們填入吧!

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=帳號
MAIL_PASSWORD=密碼
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=fdjkgh580@gmail.com
MAIL_FROM_NAME=fdjkgh580

要使用全域的 “from” (寄件者地址) 或 “reply_to” (回覆的地址),在 config/mail.php 中能發現是透過 .env 來寫入我們的 mail 設定檔,例如

'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
......

Mailables

準備一個”能夠發送郵件” (Mailables) 的類別,例如產生 app\Mail\Warning.php

php artisan make:mail Warning
<?php
namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class Warning extends Mailable
{
    use Queueable, SerializesModels;

    public $params;

    // 讓外部可以將參數指定進來
    public function __construct($params)
    {
        $this->params = $params;
    }

    public function build()
    {
        // 透過 with 把參數指定給 view
        return $this->subject("警告訊息")
            ->view('emails.warning')
            ->with([
                'params' => $this->params,
            ]);
    }
}

View

而信件內容模板的變數 $params 我們會由 Controller 傳入。我們建立 /views/emails/warning.blade.php

<p>
    {{ $params['say'] }}
</p>

Router

routes/web.php

Route::get('/warning', 'WarningController@send');

Controller 寄出郵件

php artisan make:controller WarningController
<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
// 記得使用 use
use Illuminate\Support\Facades\Mail;
use App\Mail\Warning;

class WarningController extends Controller
{
    public function send()
    {
        // 收件者務必使用 collect 指定二維陣列,每個項目務必包含 "name", "email"
        $to = collect([
            ['name' => 'Jason', 'email' => 'fdjkgh580@gmail.com']
        ]);

        // 提供給模板的參數
        $params = [
            'say' => '您好,這是一段測試訊息的內容'
        ];

        // 若要直接檢視模板
        // echo (new Warning($data))->render();die;

        Mail::to($to)->send(new Warning($params));
    }
}

這樣就能成功透過 Gmail 發送郵件囉!附帶要提的是,以上這種方法是 Laravel 比較後期的官方建議寫法,不然依照我們過去經驗例如使用過 PHPMailer ,我們可能會寫在一起,例如

Mail::send('emails.welcome', $data, function($message)
{
    $message->from('us@example.com', 'Laravel');

    $message->to('foo@example.com')->cc('bar@example.com');

    $message->attach($pathToFile);
});

雖然也可以送信,不過透過 “Mailable” 的方式,可以把整個網站的發送指派行為,全部集中在路徑app\Mail 底下;剩下在控制器中的行為也只有「用哪個 Mailable 寄給誰」。

好處就是方便維護。當我們的發送郵件行為一旦增量,例如有些要發送註冊通知信、修改密碼信、訂單成立、到貨通知、系統錯誤通知、等等非常多,要維護也只需要查看路徑 app\Mail 底下的 “Mailable” 就能很快知道有那些送件行為,省去到各個 Controller, Services, Libraries 查找的時間。

php – Joomla! 在 xml 中自訂欄位

參考來源

範例元件名稱 com_todolist

添加我們自訂的 xml

  • name=”clickme” 名稱是作為 tmpl 渲染使用,代表你的欄位叫什麼名字。
  • type=”mybutton” 會去尋找 models/fields/mybutton.php
<?xml version="1.0" encoding="utf-8"?>
<!-- components/com_todolist/models/forms/upload.xml -->
<form>
    <fieldset name="others" addfieldpath="components/com_todolist/models/fields/">
        <field name="cliekme" type="mybutton" label="我是自訂欄位" />
    </fieldset>
</form>

 

自訂欄位的物件邏輯

我們要自訂一個類型叫做 mybutton 的 HTML <button> 元件。

  • JFormFieldMybutton 為 JFormField{首字大寫你的類型名稱}
  • $type 設定首字大寫你的類型名稱
  • 務必指定 protected function getInput(),這是為了覆寫 JFormField 的方法。
<?php
// components/com_todolist/models/fields/mybutton.php
defined('JPATH_BASE') or die;
class JFormFieldMybutton extends JFormField
{
    protected $type = 'Mybutton';

    protected function getInput()
    {
        return '<button onclick="alert()">我是按鈕</button>';
    }
}

 

在 tmpl 中渲染

<!-- C:\www\joomla\components\com_todolist\views\upload\tmpl\main.php -->
<?=$this->form->renderField('cliekme')?>

 

phpmyadmin – 更新版本後,重啟 Apache 發生錯誤 (Job for apache2.service failed because the control process exited with error code.)

Ubuntu 16 重啟系統 service apache2 restart 報錯

Job for apache2.service failed because the control process exited with error code. 
See "systemctl status apache2.service" and "journalctl -xe" for details.

於是下指令查看問題

 systemctl status apache2.service

發現提示如下圖

發現原來是我的 /etc/phpmyadmin/apache.conf 的第 4 行設定錯誤 (我用了兩個別名),於是使用

vim /etc/phpmyadmin/apache.conf

修改我的檔案以後,重新啟動 Apache 就沒問題了~