yii 2

Discussion in 'PHP' started by b3, 21 Aug 2016.

  1. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Интересует все о данном фреймворке, может кто видел книги в переводе или курсы, полезные советы, рецепты итд в общем все что не на первой странице гугла а то что можно было упустить.
     
  2. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,414
    Likes Received:
    911
    Reputations:
    863
    недавно пентестели проект на этом фреемворке, нашли багу в заливке файлов, можно было шелл пролить в клиентской панеле....
     
    _________________________
  3. Absurd

    Absurd Member

    Joined:
    15 Aug 2016
    Messages:
    20
    Likes Received:
    10
    Reputations:
    0
    Именно во фреймворке баг? Или в корявой реализации программистом, который этот проект ваял?
     
  4. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,414
    Likes Received:
    911
    Reputations:
    863
    Может я и ошибаюсь, но вроде в классе заливке, не достаточная фильтрация расширения была, надо бы перепроверить...
     
    _________________________
  5. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    hesher and Absurd like this.
  6. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,414
    Likes Received:
    911
    Reputations:
    863
    _________________________
  7. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,170
    Likes Received:
    1,155
    Reputations:
    202
    Ну там список разрешенных расширений указывается через параметры формы, сам фреймворк не ограничивает, это на совести программистов
     
    Chaak likes this.
  8. bologer

    bologer Member

    Joined:
    25 Nov 2016
    Messages:
    62
    Likes Received:
    18
    Reputations:
    3
    Если английский хороший, можно cookbook почитать, достаточно качественный материал. Написано yii разрботчиком (Alexander Makarov) - https://github.com/samdark/yii2-cookbook
    Второй вариант - это тупо читать оф. документацию, которая есть на офф сайте. Она там достаточно обширная, многое что описано с примерами.
    Так же можешь почитать рецепты - https://github.com/samdark/yiiframework_ru_cookbook

    Статей по yii2 навалом, поэтому точно найдешь помощь и инфу по всем интересующим тебя вопросам.
     
    b3 likes this.
  9. cpperl

    cpperl New Member

    Joined:
    19 Nov 2016
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
  10. bologer

    bologer Member

    Joined:
    25 Nov 2016
    Messages:
    62
    Likes Received:
    18
    Reputations:
    3
    cookbook — это грубо говорят FAQ, который в виде снипетов решает частые проблемы разработчиков. Если с англ. все нормально, то можно безгранично гуглить и любой материал найти)
     
  11. ckpunmkug

    ckpunmkug Member

    Joined:
    20 Mar 2017
    Messages:
    72
    Likes Received:
    72
    Reputations:
    10
    Дорос в потребностях до framework`а, выбрал yii.
    Изучая и решая насущные задачи, наткнулся на вопросы к которым ответы из google не подходят.
    Ответы нашлись в эксперементах и мануале.
    Делающим первые шаги в освоении yii предназначается.

    Я решил отделить сайт от framework`а, что бы использовать несколько Virtual Hosts, а yii иметь только один.
    Code:
    define('YII_DIR', '/var/www/yii');
    define('WEB_DIR', '/var/www/localhost');
    
    $config = [
        /*
         * Переназначаю папку для controllers
         * Теперь их можно положить в /var/www/localhost/controllers
         * А не в дефолтную /var/www/yii/controllers
         * Только теперь надо писать namespace webroot\controllers;
         * Вместо namespace app\controllers;
         */
        'controllerNamespace' => 'webroot\\controllers',
        /*
         * Переназначаю директории для views
         */
        'layoutPath' => WEB_DIR . '/views/layouts',
        'viewPath' => WEB_DIR . '/views',
    ];
    
    Практика показала что удобней всего использовать следующий вид Pretty URLs:
    Code:
        'rules' => [
            '/' => 'site/open',
            '/<action:(open|complete|save)>' => 'site/<action>',
    
    Пареметры в GET передавать естественным для http способом.
    В Virtual Host в параметр Directory я добавил AllowOverride All.
    В корне сайта положил .htaccess
    Code:
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php
    
    Когда возникла потребность иметь разные скрипты и стили, но layout иметь один, нашел способ вставлять их из view`шек.
    Code:
    $this->css['codemirror'] = // Засунет в head
    <<< HEREDOC
    <script src='/editor-asset/codemirror/lib/codemirror.js'></script>
    <link rel='stylesheet' href='/editor-asset/codemirror/lib/codemirror.css'/>
    HEREDOC;
    
    По умолчанию подгружаются css/site.css и jquery.js их заменил заглушками. JQuery потому что загрузка файла добавляется после body, а jquery-ui грузится в head и выдаёт ошибку. А site.css для красоты.
    Code:
        'assetManager' => [
            'assetMap' => [
                'css/site.css' => '/editor-asset/editor/empty.css',
                'jquery.js' => '/editor-asset/jquery/empty.js',
            ],
        ],
    
    Некоторые фичи которые мне пригодились в написании actions
    Code:
    return $this->redirect($url); // редирект
    $filename = \Yii::$app->request->queryParams['filename']; //использовал для доступа к $_GET['filename']
    
    \Yii::$app->request->getRawBody(); // принимаю post с json
    \Yii::$app->layout = false; // отключаю layout и view
    return $this->renderContent($json); // возвращаю json в ответ на $.post( "/save", data, func, 'json');
    
    
    В качестве бонуса: Функция автодополнения имён файлов.
    Code:
    function filenameComplete(string $path)
    {
        if (empty($path)) {
            return false;
        }
    
        $pathinfo = pathinfo($path);
        if (!is_array($pathinfo)) {
            return false;
        }
    
        if (preg_match('/^(.+)\/$/', $path, $matches)) {
            $dirname = $matches[1];
            $prepend = '';
        } else {
            $dirname = $pathinfo['dirname'];
            $prepend = $pathinfo['basename'];
        }
    
        $filenames = @scandir($dirname);
        if (!is_array($filenames)) {
            return false;
        }
    
        $result = [];
        $prepend = preg_quote($prepend);
        foreach($filenames as $filename) {
            if (preg_match('/^'.$prepend.'.*$/', $filename) == 1) {
                if ($dirname == '/' ) {
                    $filename = "/{$filename}";
                } else {
                    $filename = "{$dirname}/{$filename}";
                }
                array_push($result, $filename);
            }
        }
        return $result;
    }