Here at SunshinePHP 2017 I did a presentation on automating the code QA process. Find the slides here: https://goo.gl/GanL3n
(Originally posted on the Sourcetoad Blog circa 20015)
Yii is an amazing framework. As it has been iterated on version 2 is now out and is quickly picking up adoption. With this comes the need to migrate components, modules, and a whole slew of other logic. This blog is a few pointers that we picked up along the way while doing a forum migration. This was the first feature migration we did in house, it was an interesting experience.
RTFM, this may seem a no brainer but read the manual, specifically about the Yii1->2 changes. http://www.yiiframework.com/doc-2.0/guide-intro-upgrade-from-v1.html
Use a source control system. GiT, SVN, Mercurial, etc.
Run the tests, make change, run tests, refactor, run tests, commit, run tests
Pick a specific part of logic / cord to replace. GridViews, DetailList, etc. Do one chunk at a time.
Give back to the community, no one like that guy that takes and takes and never gives back.
One of the most obvious changes has been the inclusion of autoloading classes. Good bye require_once(‘composer/autoloader.php’), hello namespacing. With this change the class names have become much more sane. No more ‘CBaseModel’, now \BaseModel.
The model level logic has seen a substantial change as well. “…In 1.1, query building was scattered among several classes, including CDbCommand, CDbCriteria, and CDbCommandBuilder. Yii 2.0 represents a DB query in terms of a Query object that can be turned into a SQL statement with the help of QueryBuilder behind the scene…” (Yii2 documentation). Now queries are similar this example:
$modelData = \packageName\common\models\ModelName::find()->andWhere([‘id’ => $userId])->one();
Idealy this would return the user’s data from the specified model.
Moving on the view level widgets have had a measurable change as well:
$this->widget('yii.widgets.grid.CGridView', array( 'dataProvider'->$dataProvider, 'columns'=> array( 'title', // display the 'title' attribute 'category.name', // display the 'name' attribute of the 'category' relation 'content:html', // display the 'content' attribute as purified HTML array( // display 'create_time' using an expression 'name'=>'create_time', 'value'=>'date("M j, Y", $data->create_time)', ), array(// display 'author.username' using an expression 'name'=>'authorName', 'value'=>'$data->author->username', ), array(// display a column with "view", "update" and "delete" buttons 'class'=>'CButtonColumn', ), ), ));
GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ [ 'class' => 'yii\grid\SerialColumn' ], 'title', // display the 'title' attribute 'category.name',// display the 'name' attribute of the 'category' relation 'content:raw', // display the 'content' attribute as purified HTML [ // display 'create_time' using an expression 'name' => 'create_time', 'value' => 'date("M j, Y", $data->create_time)', ], ], [// display 'author.username' using an expression 'name' => 'authorName', 'value' => '$data->author->username', ], [ 'class' => 'yii\grid\ActionColumn'], //CRUD UI elements ] ]);
The astute eye will notice that the base code has simply been updated to the current recommendations. the main change being how the widget is instantiated. The astute will also notice the new column’s `SerialColumn` and `ActionColumn`. These two handy classes provide serialized numbering and CRUD UI elements for the column data. DetailView, ItemView, etc have all been iterated on in this way.
That is all the time we have for today but we hope this has provided insightful. It is highly recommended you take a look at the documentation provided by the Yii team for even more details. http://www.yiiframework.com/doc-2.0/guide-intro-upgrade-from-v1.html
http://keepcoding.ehsanabbasi.com/ has released a PHP project starter template with a nicely put together setup. Composer, Travis, PHP Mess Detector, etc. If you find yourself doing the same steps over and over every time your start a project this will save you time and effort (don’t reinvent the wheel, right?). Head over the the blog article page or clone the repo from GitHub.
EAP 2018.1 will include loop refactoring to use SPL array_* functions. Nice!
Watch these 9 short videos; take them in, live them, be them.
One of my favorite tech news sites StackShare has releases there annual Top Tools list of 2017. From New Tool of the Year to Business Tool of the Year to Top Developers of the Year the group of lists and the comprehensive nature of the list is pretty substantial. Head over the StackShare and check it out.
Inspired by a recent conversation with a peer I decided to get together a list of 10 resources concerning software as a whole. Both for future reference and as a starting point for anyone else who finds it helpful. This list is agnostic of language or platform or reach. This is meant to be a intro, as no list would ever be complete with the abundance of resources available.
- https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612 by the Gang of Four
If you have any suggestions for a future list, message me on Twitter! Enjoy.